Scrapy输出的数据中包含国际Unicode字符(例如日语字符)的问题

7

我是一个Python和Scrapy的新手,我正在按照dmoz教程学习。作为教程建议的起始URL的微小变体,我选择了dmoz示例站点中的一个日本类别,并注意到最终得到的feed导出显示unicode数值而不是实际的日本字符。

看起来我需要以某种方式使用TextResponse,但我不确定如何让我的爬虫使用该对象而不是基本的Response对象。

  1. 我应该如何修改代码以在输出中显示日语字符?
  2. 如何摆脱方括号、单引号和包装输出值的'u'?

最终,我想要一个输出,比如说:

オンラインショップ(这些是日语字符)

而不是当前的输出:

[u'\u30aa\u30f3\u30e9\u30a4\u30f3\u30b7\u30e7\u30c3\u30d7'](Unicode)

如果您查看我的截图,它对应于文本标题之一的C7单元格。

以下是我的爬虫(与教程中的相同,除了不同的start_url):

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from dmoz.items import DmozItem

class DmozSpider(BaseSpider):
   name = "dmoz.org"
   allowed_domains = ["dmoz.org"]
   start_urls = [
       "http://www.dmoz.org/World/Japanese/"
   ]

   def parse(self, response):
       hxs = HtmlXPathSelector(response)
       sites = hxs.select('//ul/li')
       items = []
       for site in sites:
           item = DmozItem()
           item['title'] = site.select('a/text()').extract()
           item['link'] = site.select('a/@href').extract()
           item['desc'] = site.select('text()').extract()
           items.append(item)
       return items

settings.py:

FEED_URI = 'items.csv'
FEED_FORMAT = 'csv'

输出截图: http://i55.tinypic.com/eplwlj.png(抱歉,我还没有足够的SO积分来发布图片)


爬取工作正常,问题只在于值如何写入磁盘。您是如何调用Scrapy运行代码的? - Thomas K
1
@Thomas 我想问题只是因为文本嵌入了列表中。一旦我从列表中提取它们,Unicode 字符就可以正确显示了。 - fortuneRice
1个回答

1

当你从页面上抓取文本时,它会以Unicode形式存储。

你想做的是将其编码为类似UTF8的东西。

unicode_string.encode('utf-8')

此外,当您使用选择器提取文本时,即使只有一个结果,它也会存储在列表中,因此您需要选择第一个元素。

谢谢,我最终意识到它们被存储在列表中,并最终使用了 if item['title']: item['title'] = item['title'].pop() 来提取它们。至于编码,在我提取后,它们自动转换为正确的字符。 - fortuneRice
顺便问一下,如果需要将TextResponse替换为Response,我该怎么做? - fortuneRice
@fortuneRice 我在解析泰米尔语内容时也遇到了同样的问题。请分享您解决此问题的代码。(我无法理解您在哪里使用了.pop()) - Mugunth
@Mugunth,抓取的文本存储在列表数据结构中。使用.pop()从列表中提取项目。希望能有所帮助。 - fortuneRice
对我来说,我得到了正确的输出,而没有获取“列表”的第一个元素。 - OMGPOP
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接