【问题标题】:Scrapy Json Rule SgmlLink ExtractorScrapy Json 规则 SgmlLink 提取器
【发布时间】:2016-09-06 03:46:22
【问题描述】:

我只想知道当网站向我发送 json 响应而不是 html 时如何制定规则?在开始 url 第一个响应中,它给了我一个 html 响应,但是当我浏览页面时,它给了我 json 响应。这是我的规则:

 Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="GridTimeline-items"]'), tags=('div'),
                                   attrs=('data-min-position'), allow=(r''), process_value=my_process_value_friends),
                                    callback='parse_friends', follow=True),

我的问题是,如何将 xpath 应用于 json 响应?

谢谢,

【问题讨论】:

  • 您应该使用scrapy.linkextractors.Linkextractor,因为SgmlLinkExtractor 已经被弃用了一段时间。不过,这两者本质上是一回事。

标签: python json scrapy web-crawler sgml


【解决方案1】:

您不能使用 xpath 或 css 选择器解析 json。但是,您可以将 json 转换为 python 字典:

import json
def parse(self, response):
    data = json.loads(response.body)
    # then just parse it, e.g.
    item = dict()
    item['name'] = data['name']
    # ...

或者您可以将 json 转换为 xml,然后使用 scrapy 选择器对其进行解析。有很多软件包可以做到这一点,但我会在示例中突出显示 dicttoxml

import json
from dicttoxml import dicttoxml
from scrapy import Selector
def parse(self, response):
    data = json.loads(response.body)
    data_xml = dicttoxml(data)
    sel = Selector(root=data_xml)
    # then parse it
    item = dict()
    item['name'] = sel.xpath("//name/text()")
    # ...

【讨论】:

  • 谢谢,但我正在寻找规则的解决方案,而不是在解析阶段
  • @Reymark 如果不扩展 CrawlSpider 的工作方式,您将无法在 json 源代码上使用 restrict_xpath。不过,简单的方法是按照我在回答中描述的那样手动进行。只需在您的 LinkExtractor 中有parse 回调并检查页面是否开头为 json,如果是则查找 json url,否则照常继续。
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多