【问题标题】:Scrapy Selector issueScrapy 选择器问题
【发布时间】:2018-01-31 01:53:06
【问题描述】:
from scrapy.spiders import BaseSpider
from scrapy.selector import HtmlXPathSelector

class PriceSpider(BaseSpider):
    name = 'price'
    start_urls = ['https://www.nyse.com/quote/XNYS:A']

    def parse(self,response):
        price = response.xpath('//div[@class="d-dquote-x3"]//text()').extract()
        print(price)

我正在尝试从这行 html 中提取价格:

<div><span class="d-dquote-x3">72.99</span>

它返回一个空列表,我怎样才能使价格(72.99)成为我的输出?

编辑:我认为这是一个关于具有动态内容的网站的问题,任何人都可以确认这一点,如果是的话,建议采取行动?

【问题讨论】:

  • 试试这个来获取数据response.css('.d-dquote-x3::text').extract_first()。但是,只有在使用splash 或任何浏览器模拟器(如selenium)结合scrapy 来呈现动态生成的内容时,您才能定位数据。

标签: html python-3.x xpath scrapy web-crawler


【解决方案1】:

问题是选择器错误。你的元素是

<div><span class="d-dquote-x3">72.99</span>

所以该类与span 相关联,而不是div。你需要

price = response.xpath('//span[@class="d-dquote-x3"]//text()').extract()

【讨论】:

    【解决方案2】:

    是的,该页面具有动态内容。从它在浏览器中的加载方式可以看出这一点,但您也可以通过更直接地获取 html 并查看它来进行检查。我是这样做的:

    import requests
    response = requests.get('https://www.nyse.com/quote/XNYS:A')
    with open('/tmp/test.html', 'w') as out:
        out.write(response.text)
    

    然后我在浏览器中查看 /tmp/test.html。没有报价数据。

    如果你想获得这些数据,你需要查看headless browsers

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      相关资源
      最近更新 更多