Python 使用scrapy和xpath使用特定文本刮取节点

Python 使用scrapy和xpath使用特定文本刮取节点,python,xpath,scrapy,Python,Xpath,Scrapy,我不明白为什么下面的方法不起作用。我知道有相关的答案,但它们没有帮助我 $ scrapy shell "http://edition.cnn.com" 有一个h2标签,里面有“CNN货币”作为文本。为什么下面的代码不起作用 >>> response.xpath('//h2[contains(string(), "CNN Money")]') [] 我还尝试了text() 这与您使用的XPath表达式无关。问题是页面内容是动态提供的,例如由一些JavaScript提供。检查你

我不明白为什么下面的方法不起作用。我知道有相关的答案,但它们没有帮助我

$ scrapy shell "http://edition.cnn.com"
有一个
h2
标签,里面有“CNN货币”作为文本。为什么下面的代码不起作用

>>> response.xpath('//h2[contains(string(), "CNN Money")]')
[]
我还尝试了
text()


这与您使用的XPath表达式无关。问题是页面内容是动态提供的,例如由一些JavaScript提供。检查你自己——尝试在网页源代码中搜索CNN Money。你找不到任何线索。您需要呈现页面并解析输出。我建议你和图书馆一起使用

编辑:

使用以下命令运行Splash:

docker run -d -p 8050:8050 --restart=always scrapinghub/splash --max-timeout 3600
它增加了请求的最大超时时间。(您可以查看如何在生产中运行Splash的其他选项。)您还需要将
args
参数中的
timeout
字段增加到
SplashRequest
,例如

yield scrapy_splash.SplashRequest(url, self.parse, endpoint='render.json', args={'timeout': 3600})

这与您使用的XPath表达式无关。问题是页面内容是动态提供的,例如由一些JavaScript提供。检查你自己——尝试在网页源代码中搜索CNN Money。你找不到任何线索。您需要呈现页面并解析输出。我建议你和图书馆一起使用

编辑:

使用以下命令运行Splash:

docker run -d -p 8050:8050 --restart=always scrapinghub/splash --max-timeout 3600
它增加了请求的最大超时时间。(您可以查看如何在生产中运行Splash的其他选项。)您还需要将
args
参数中的
timeout
字段增加到
SplashRequest
,例如

yield scrapy_splash.SplashRequest(url, self.parse, endpoint='render.json', args={'timeout': 3600})

我设法让Splash工作起来了,谢谢!必须使用启动docker时显示的IP地址,而不是教程中的IP地址。我现在需要了解更多关于Splash的信息,因为呈现的HTML Splash给我的东西看起来像一团乱麻,我不知道如何找到我想要刮的东西。@Andras它可能看起来像一团乱麻,因为Splash在默认情况下不会获取所有东西,但是你应该能够通过其他浏览器的工具(Firefox、Chrome)查看页面时以相同的方式获取所有元素。谢谢!现在我明白了!这段视频也很有帮助:我设法让Splash正常工作,谢谢!必须使用启动docker时显示的IP地址,而不是教程中的IP地址。我现在需要了解更多关于Splash的信息,因为呈现的HTML Splash给我的东西看起来像一团乱麻,我不知道如何找到我想要刮的东西。@Andras它可能看起来像一团乱麻,因为Splash在默认情况下不会获取所有东西,但是你应该能够通过其他浏览器的工具(Firefox、Chrome)查看页面时以相同的方式获取所有元素。谢谢!现在我明白了!这段视频也很有帮助: