Scrapy,在没有引号的情况下在HTML标签中抓取文本?

时间:2018-04-26 18:38:52

标签: python web-scraping scrapy

更新:此号码48显示在" Inspect"在Chrome中,但不在"查看页面来源"。现在明白它是由JavaScript生成的,这就是我无法提取它的原因。

这是我试图抓取的HTML的一部分

<span class="value">
     <span class="base-entity-display-count">48</span> 
     "times"
</span>

问题是我无法得到这个48号码 我认为这个问题是因为没有&#34;&#34;大约48. 因为我可以得到&#34;次&#34;没有问题的文字,我能看到的唯一区别是没有&#34;&#34;大约48岁。

这是适用于&#34;时代&#34;:

的代码
response.xpath('.//span[@class="value"]/text()').extract_first()
>>> u'<span class="value"><span class="base-entity-display-count"></span>times</span>'

对于48:

response.xpath('.//span[@class="base-entity-display-count"]').extract_first()
>>> u'<span class="base-entity-display-count"></span>'

如您所见,48缺失。

有人有解决方案或想法吗?

1 个答案:

答案 0 :(得分:3)

如果您查看页面正文并搜索您的号码,您可以看到有一些嵌入的json。 enter image description here

要解决此问题,您可以:

  1. 使用正则表达式查找嵌入的json:

    import re
    # select everything between "ap.boot.push(" and ");"
    data = re.findall('app.boot.push\((\{.+?\})\);', response.body_as_unicode())
    
  2. 加载json并使用python解析它以找到所需的值:

    import json
    data = [json.loads(d) for d in data]
    for d in data:
        if d.get('name') == 'BaseEntityDetails':
            print(d['values']['displayCountText'])
    #prints: 66