这可能是一个非常概念性的问题,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”,如果有其他这样的元素火狐在 XPath 的中间追加/插入,除了 tbody 在尝试获取响应之前我应该删除(使用 hxs.select)/构建我的项目管道。
我发现了一个可能的解释:“特别是 Firefox,以向表格添加元素而闻名。另一方面,Scrapy 不会修改原始页面 HTML,因此如果您使用您的 XPath 表达式。” 来源:Firefox,另请参阅: 使用 XPath、Python 和 Scrapy 解析 HTML
Q2: 在 FirePath 窗格中读取绝对路径时,即使删除 tbody 后响应也不起作用 - 为什么会这样?
Q3:是否有关于 Firebug 和 XPath 检查器之间的哪一个更好的最佳实践(阅读更健壮/一致) - 如果是,为什么以及哪一个?
Q4不相关:有些人建议在构建 XPath 时在浏览器上禁用 Javascript,这是否相关并且禁用 JavaScript 是一种标准做法?在刮(如果有的话)时不这样做有什么影响?
相关 - Xpath Table Within Table Parsing HTML with XPath, Python and Scrapy