使用XPath、Python和Scrapy解析HTML
我正在写一个Scrapy程序来提取数据。
这是我想要抓取的链接,我想要抓取20111028013117
(代码)相关的信息。我已经从Firefox的一个插件XPather中获取了XPath。这是我得到的路径:
/html/body/p/table/tbody/tr/td/table[2]/tbody/tr[1]/td/table[3]/tbody/tr/td[2]/table[1]/tbody/tr/td/table/tbody/tr/td[2]/table[3]/tbody/tr/td/table/tbody/tr[2]/td[2]
当我尝试执行这个路径时
try:
temp_list = hxs.select("/html/body/p/table/tbody/tr/td/table[2]/tbody/tr[1]/td/table[3]/tbody/tr/td[2]/table[1]/tbody/tr/td/table/tbody/tr/td[2]/table[3]/tbody/tr/td/table/tbody/tr[2]/td[2]").extract()
print "temp_list:" + str(temp_list)
except:
print "error"
结果却是一个空列表,我已经为这个问题挣扎了4个小时。我是Scrapy的新手,虽然我在其他项目中处理问题还不错,但这次似乎有点困难。
4 个回答
2
你可以使用更强大的XPath来提取数据,这样比直接从XPather获取输出要简单得多。
对于你要匹配的数据,这个XPath效果会好很多:
//font[contains(text(),'Code')]/parent::td/following-sibling::td/font/text()
这个XPath会找到包含“Code”的<font>
标签,然后再去找它上面的td
标签,接着选择下一个td
标签中的font
,这样就能找到你想要的代码了。
3
我看到你要找的元素在一个 <table>
标签里面。
Firefox 浏览器会为每个表格自动添加一个 tbody
标签,即使在原始的 HTML 代码中没有这个标签。这可能就是你在浏览器中使用的 xpath 查询能正常工作,但在 Scrapy 中却失败的原因。
正如建议的那样,尝试在你的 xpath 查询中使用其他的锚点。
9
你的xpath不工作的原因是因为有一个叫tbody
的东西。你需要把它去掉,然后再看看能不能得到你想要的结果。
你可以在scrapy的文档里找到相关信息:http://doc.scrapy.org/en/0.14/topics/firefox.html
特别是Firefox浏览器,它会在表格中自动添加
<tbody>
元素。而scrapy则不会改变原始页面的HTML,所以如果你的XPath表达式里用到了<tbody>
,就无法提取到任何数据。