使用XPath、Python和Scrapy解析HTML

3 投票
4 回答
3114 浏览
提问于 2025-04-17 05:15

我正在写一个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>,就无法提取到任何数据。

撰写回答