2017-05-23 2 views
1

Als ich gestern die Scrapy ausprobierte, versuchte ich, die Titel der Beiträge eines chinesischen Ruby-Forums zu holen. Aber irgendwie die Ausgänge des Scrapy sind alle Unicode, wieUnpassende Codierung der Antwort von Scrapy

"[\u5317\u4eac][2017\u5e746\u670818\u65e5] Rails Girls" 

Ich habe die Codierung der Antwort ausgecheckt ist UTF-8 und ich ausgedruckt, den Inhalt des Körpers, die korrekt die chinesischen Zeichen zeigen.

Also ich bin davon verwirrt, warum ich Scrapy-Selektor verwenden, um den Titel auszuwählen und die Ausgabe in eine JSON-Datei zu legen. Der Inhalt der Datei sind dann alle Zeichenzeiger wie \u5317. Jede Hilfe wird geschätzt. Vielen Dank.

Mein Code:

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()} 

Antwort

1

Wenn Scrapy ruft den Rückruf mit einer Antwort für eine URL, die Antwort enthält den dekodiert Unicode Körperinhalt, wie response.text und das „rohe“ Bytes des empfangenen Körpers, welche Kodierung auch immer verwendet wurde, wie response.body.

Wenn Sie Scrapy-Selektoren verwenden, die Sie von response.xpath() oder response.css() aufrufen, und Sie aufrufen, erhalten Sie Python Unicode-Zeichenfolgen.

Python 2.7 verwendet \uXXXX Escape-Sequenzen, um sie darzustellen. Das sehen Sie in den Konsolenprotokollen der ausgegebenen Objekte.

Aber wenn man Druck auf jene Zeichenfolge aufrufen, sehen Sie die Zeichen selbst:

$ 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 官方频道 
>>> 

Nun, wenn Sie Ihre Einzelteile als JSON exportieren, zum Beispiel mit -o items.json, standardmäßig wird Scrapy auch schreiben \uXXXX Escape-Sequenzen in JSON-Strings der verschiedenen Elemente. Es ist das gleiche wie Python 2.7 Nicht-ASCII-Zeichen darstellt, und das ist 100% gültige JSON-Ausgabe, und ist eigentlich der Standard für Pythons json Modul (ensure_ascii genannt). Wenn Sie wirklich UTF-8 Zeichen in der JSON-Ausgabedatei benötigen, können Sie Scrapys FEED_EXPORT_ENCODING='utf-8' setting verwenden.

+0

Vielen Dank für die richtige und detaillierte Antwort! –