当我昨天试用Scrapy
时,我试图获取中文Ruby论坛帖子的标题。但是,不知何故Scrapy
的输出都是Unicode
,如
"[\u5317\u4eac][2017\u5e746\u670818\u65e5] Rails Girls"
我已经检查了响应的编码是UTF-8
,我打印出正确显示中文字符的正文内容。
所以,我很困惑为什么我使用Scrapy选择器来选择标题并将输出放到Json文件中。然后,文件的内容都是字符指针,如\u5317
。任何帮助将不胜感激。感谢。
我的代码:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['https://ruby-china.org/topics']
def parse(self, response):
self.logger.warning("body: %s", response.body)
for topic in response.css('div.topic'):
title = topic.css('div.media-heading')
yield {'title': title.css('a ::attr(title)').extract_first()}
答案 0 :(得分:1)
当Scrapy通过对URL的响应调用您的回调时,响应包含已解码的Unicode正文内容,如response.text
和" raw"接收体的字节,无论使用何种编码,都为response.body
。
当您使用从response.xpath()
或response.css()
调用获得的Scrapy选择器,并在其上调用.extract()
时,您将获得Python Unicode字符串。
Python 2.7使用\uXXXX
转义序列来表示它们。这就是您在产生的项目的控制台日志中看到的内容。
但是如果你在这些字符串上调用print,你会看到字符本身:
$ scrapy shell https://ruby-china.org/topics
2017-05-23 13:15:33 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
(...)
2017-05-23 13:15:33 [scrapy.core.engine] INFO: Spider opened
2017-05-23 13:15:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://ruby-china.org/topics> (referer: None)
(...)
>>> for topic in response.css('div.topic'):
... title = topic.css('div.media-heading')
... print(title.css('a ::attr(title)').extract_first())
...
[北京][2017年6月18日] Rails Girls 复活啦 2017 北京活动报名 | 少女们一天学编程
招 ruby 开发偏执狂,分享产品成果
challenge #1
[上海/成都] Le Wagon 编程训练营招聘 Ruby 导师,2200/ 天
量产型炮灰工程师
如果开发公众号内的小应用,rails 前端搭配哪个框架,vue?react?angular?
[长沙] Kdan Mobile 招聘 Ruby on Rails 工程师 (9K~15K)
Ruby 开发有什么新的进展吗?PHP 貌似要上 JIT 了!
这种需要强行增加对象阅读数,有其他建议吗?
rails 项目,production 模式在 ie8 下报"'undefined' 为空或不是对象"错误
pwc (sdc) 招后端,前端,区块链应用开发。
我想做个类似 app 中的消息中心,比如我下完订单,就会提示我订单的状态!
[上海] 郎客信息技术有限公司招聘 Rails 实习生 2 名
Rails 5.1 使用 yarn 和 webpack 实战 (vue, 构建等)
[上海] 赛若福诚聘 Ruby 工程师
[上海&杭州] Change 健身潮流文化社区招收 Ruby 工程师 (15-40k 十四薪)
[宁波] 新希望软件 Ruby 工程师 3 名 [8k~12k]
如何禁用下拉列表
為你自己學 Ruby on Rails
使用 RSpec 在 Rails 5 下测试邮件的发送
GitHub API v4 改用 GraphQL 了
[上海] 2017.5.21 Elixir Meetup
多态情况下关联表查询问题
Rails 与 Django 性能的疑问
[北京] 西单,金融方向,欢迎 Ruby 大牛 [15k~30k]
云梯正式开通 Telegram 官方频道
>>>
现在,如果您将项目导出为JSON,例如使用-o items.json
,则默认情况下,Scrapy还会在不同项目的JSON字符串中编写\uXXXX
转义序列。它与Python 2.7如何表示非ASCII字符以及100%有效的JSON输出相同,并且实际上是Python json
模块的默认值(称为ensure_ascii
)。
如果您确实需要JSON输出文件中的UTF-8字符,则可以使用Scrapy&#39; FEED_EXPORT_ENCODING='utf-8'
setting。