【问题标题】:Scrapy output feed international unicode characters (e.g. Japanese chars)Scrapy 输出提供国际 unicode 字符(例如日文字符)
【发布时间】:2011-05-31 18:31:04
【问题描述】:

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

似乎我需要以某种方式使用TextResponse,但我不确定如何让我的蜘蛛使用该对象而不是基本 Response 对象。

  1. 我应该如何修改我的代码以在我的输出中显示日语字符?
  2. 如何去掉方括号、单引号和包裹输出值的“u”?

最终,我想要输出 say

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

而不是当前的输出

[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 我认为问题在于文本嵌入在列表中。一旦我从列表中提取它们,unicode 字符就会正确显示。

标签: python unicode scrapy


【解决方案1】:

当您从页面中抓取文本时,它会以 Unicode 格式存储。

您要做的是将其编码为 UTF8 之类的东西。

unicode_string.encode('utf-8')

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

【讨论】:

  • 感谢我最终意识到它们存储在列表中并最终使用if item['title']: item['title'] = item['title'].pop() 来提取它们。至于编码,我提取后自动变成了正确的字符。
  • 顺便说一句,如果需要,我如何将 TextResponse 换成 Response?
  • @fortuneRice 我在解析泰米尔语内容时也遇到了同样的问题。请分享您解决此问题的代码。 (我不明白你在哪里使用 .pop() )
  • @Mugunth 抓取的文本存储在列表数据结构中。 .pop() 用于从列表中提取项目。希望对您有所帮助。
  • @fortuneRice 很抱歉再次打扰您。我不明白如何使用列表中的 .pop() 将数据存储到 csv 中。例如:我有类似于以下的解析定义://对于站点中的站点: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 // 它如果你能让我知道这个 .pop() 在这段代码中的位置会很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多