我在此页Pittsburgh Steelers at New England Patriots - September 10th, 2015上使用scrapy shell来提取各个团队统计信息。例如,我想为远程团队提取总码数(464),当检查元素并复制XPath产量时
//*[@id="team_stats"]/tbody/tr[5]/td[1]
但是当我跑步时
response.xpath('//*[@id="team_stats"]/tbody/tr[5]/td[1]')
什么都没有。我注意到这个表与初始数据分开,所以我不确定是否需要从更高的位置开始。即使只是搜索
//*[@id="team_stats"]
xpath什么都不返回。任何帮助将不胜感激。
答案 0 :(得分:1)
您遇到的问题(如大多数情况下这样)网站使用JavaScript来呈现游戏的完整信息。这意味着当您在浏览器中打开网站时,Scrapy看不到您所看到的网站。
因为Scrapy在加载页面后没有运行任何JavaScript,所以它不会使用ID team_stats
呈现出正确的表格。 “团队统计数据”表的内容在已加载的网站中,但它们已被注释掉。
一种解决方案是提取包含团队统计信息的评论,并将评论文本转换为HTML并提取在那里找到的数据。
response.xpath('//div[@id="all_team_stats"]//comment()').extract()
上面的文字提取了包含所需表格的评论。
为了将来的分析,我建议您使用Chrome的开发人员工具,您可以在其中禁用JavaScript以分析网站并使用该选项加载网站。这将返回页面的内容,因为Scrapy会看到它。
修改强>
提取评论后,您可以将其提供给新的选择器,就像Markus在评论中提到的那样:
new_selector = Selector(text=extracted_text)
在这个新的选择器上,您可以像.xpath()
对象一样再次使用response
。
删除注释分隔符很简单:您必须从提取的文本的开头和结尾删除它,这是一个字符串。 HTML中的评论以<!--
开头,以-->
结尾。您需要将这些字符之间的文本提供给新选择器。
从上面扩展示例:
extracted_text = response.xpath('//div[@id="all_team_stats"]//comment()').extract()[0]
new_selector = Selector(text=extracted_text[4:-3].strip())
new_selector.xpath('//*[@id="team_stats"]/tbody/tr[5]/td[1]').extract()