Pro-Football-Reference Team Stats XPath

时间:2016-08-05 04:52:30

标签: python xpath scrapy

我在此页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什么都不返回。任何帮助将不胜感激。

1 个答案:

答案 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()