【发布时间】:2013-07-24 07:06:31
【问题描述】:
这可能是一个非常概念性的问题,Stack Overflow 有丰富的关于 scrapy 和构建 Xpaths 的资源 - 但我没有找到任何具体回答这个问题的东西,所以问。
在使用 Firebug 和 XPath 检查器(独立地)为 Scrapy(在 python 中)构建我的 XPath 表达式时 - 我看到了两种不同的方式来构建我的 Xpath。我知道对于特定的 Xpath/HTML 层次结构,可以有许多可能的方法来构建 XPath,以便能够提取/抓取感兴趣的元素。我也知道您可以生成绝对/相对 Xpath(在 Firepath 中)
更具体地说-
示例用例 -- 尝试在 ebay 上抓取页面
scrapy shell http://www.ebay.com/sch/Coats-Jackets-/57988/i.html
--使用 Xpath 检查器-- [工作正常,从 XPath 中删除 tbody 后]]
Xpath = id('ResultSetItems')/table/tbody/tr/td/div/div/div/div/div/h4/a/text() hxs.select("id('ResultSetItems')/table/tr/td/div/div/div/div/div/h4/a/text()").extract()
-- 在 Firepath 中使用相对路径-- [在从 XPath 中删除 tbody 后有效,可以]
XPath = .//[@id='ResultSetItems']/table[1]/tbody/tr/td[1]/div/div/div/div/div[2]/h4/a /@href hxs.select(".//[@id='ResultSetItems']/table[1]/tr/td[1]/div/div/div/div/div[2]/h4/a/ @href").extract()
-- 在 Firepath 中使用绝对路径-- [不起作用,即使在从 XPath 中删除 tbody 之后]
XPath = =html/body/div[5]/div[2]/div[3]/div[1]/div/div/div[2]/div/div[6]/div/table[ 1]/tbody/tr/td[1]/div/div/div/div/div[2]/h4/a/@href hxs.select("html/body/div[5]/div[2]/div[3]/div[1]/div/div/div[2]/div/div[6]/div/table[1 ]/t>r/td[1]/div/div/div/div/div[2]/h4/a/@href").extract() 不起作用,即使在删除 tbody 之后
请注意,我只有在从 XPath 中明确删除“tbody”后才能看到响应,但这不适用于通过 Firepath 生成的绝对路径。
Q1:为什么我需要删除“tbody”,如果还有其他这样的元素,Firefox 会在 XPath 中间追加/插入,除了在尝试获取之前我应该删除的 tbody响应(使用 hxs.select)/构建我的项目管道。
我发现的一个可能的解释是:“特别是 Firefox,以向表格添加元素而闻名。另一方面,Scrapy 不会修改原始页面 HTML,因此如果出现以下情况,您将无法提取任何数据您在 XPath 表达式中使用。" 来源:Firefox,另见:Parsing HTML with XPath, Python and Scrapy
Q2:在 FirePath 窗格中读取绝对路径时,即使删除 tbody 后响应也不起作用 - 为什么会这样?
Q3 : 是否有最佳实践说明 Firebug 和 XPath 检查器之间的哪一个效果更好(阅读更健壮/一致) - 如果是,为什么以及哪一个?
Q4 不相关:有些人建议在构建 XPath 时在浏览器上禁用 Javascript,这是否相关并且禁用 JavaScript 是一种标准做法?在刮(如果有的话)时不这样做会有什么影响?
相关 - Xpath Table Within Table Parsing HTML with XPath, Python and Scrapy
【问题讨论】:
标签: xpath python-2.7 html-parsing firebug scrapy