簡體   English   中英

通過 Scrapy (Python) 將抓取的數據導出到 csv 后,我在文件中得到了像 †這樣的字符

[英]After exporting scraped data to csv via Scrapy (Python), I'm getting characters like †in the file

我在 Scrapy 中編寫了一個蜘蛛來從quotes.toscrape.com 中提取數據,但是當我將提取的數據導出到 csv 時,“(引號符號)正在將自身轉換為像 †這樣的字符

這是在spider下編寫的代碼,可以在windows機器上的sublime text3上看到。

# -*- coding: utf-8 -*-
import scrapy


class TestSpider(scrapy.Spider):
    name = 'Test'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        quotes = response.xpath('//*[@class="quote"]')
        for quote in quotes:
            text = quote.xpath('.//*[@class="text"]/text()').extract_first()
            author = quote.xpath('.//*[@class="author"]/text()').extract_first()
            tags = quote.xpath('.//*[@itemprop="keywords"]/@content').extract_first()
            yield{"Text": text, "Author": author, "Tags": tags}
        next_p = response.xpath('//*[@class="next"]/a/@href').extract_first()
        absolute_n = response.urljoin(next_p)
        yield scrapy.Request(absolute_n)

另外,這里是我用來將類字典中定義的數據導出到 csv 文件的命令。(這是通過 windows 命令提示符下的 scrapy shell 運行的)

scrapy crawl Test -o scraped.csv

這就是我收到 csv 文件中的數據的方式。

請幫我解決像初學者一樣對待我的問題。

如果將智能引號(如 '“`、U+201C)編碼為 UTF-8,然后嘗試將它們解碼為 ISO Latin 9、Windows-1252 或其他類似於拉丁語的內容,那么 mojibake 序列看起來就像你得到的一樣-1 但有歐元符號。 例如:

>>> print('\u201c'.encode('utf-8').decode('iso-8859-9')
â

有兩個地方可能會出錯。 由於您沒有在過程的任何步驟或任何代碼中向我們展示原始字節,因此不可能知道兩者中的哪一個出了問題,但我可以解釋如何處理它們。


首先,您可以將包含這些引號的 HTML 響應解碼為 Latin-9 或其他格式,即使它是用 UTF-8 編碼的。

如果你明確地這樣做,就停止這樣做。

但更有可能的是,例如, TextResponse從 Scrapy 獲取 TextResponse 並且只是訪問resp.text ,並且頁面具有不正確的標題或meta標記等,導致 Scrapy 對其進行錯誤解碼。

要解決此問題,您需要訪問原始字節並顯式解碼它們。 所以,如果你使用resp.text ,你會做resp.body.decode('utf8')代替。


或者,您可以很好地解碼 HTML,並很好地編碼 CSV,並且您只是將 CSV 以 Latin-9 而不是 UTF-8 的形式打開。 在這種情況下,您的代碼無需更改; 您只需要查看電子表格程序的設置。

但是,如果您使用的是 Windows,很多 Windows 軟件(尤其是來自 Microsoft)都會做出一些奇怪的假設。 默認情況下,假定文本文件在 OEM 代碼頁中編碼,通常類似於 Windows-1252。 要覆蓋它並強制使用 UTF-8,您需要包含一個“字節順序標記”。 這並不是一個真正的字節順序標記(因為這對 8 位編碼沒有意義),並且 UTF-8 標准強烈不鼓勵這樣做,但微軟還是這樣做了)。

因此,如果您在 Windows 上使用 Excel,並且不想更改設置,則可以通過使用utf-8-sig編碼而不是utf-8編寫文件來解決 Microsoft 的問題,這將強制執行此操作“BOM”要寫:

with open('outfile.csv', 'w', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    # etc.

由於您似乎只是通過將-o csv傳遞給scrapy crawl命令來創建導出管道,我相信您需要在您的配置文件中設置FEED_EXPORT_ENCODING (通過編輯settings.py或使用scrapy settings命令),在crawl命令行( -set FEED_EXPORT_ENDCODING=utf-8-sig ),或在環境變量中( SET FEED_EXPORT_ENDCODING=utf-8-sig在您scrapy crawl之前在cmd控制台窗口中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM