首页 文章

获取响应元素的区别:使用Firebug和XPath Checker扩展的Scrapy中的绝对和相对XPath

提问于
浏览
2

这可能是一个非常概念性的问题,而且Stack溢出在scrapy和构建Xpath上有很多资源 - 但我没有找到任何具体的答案,所以要问 .

使用Firebug和XPath检查器(独立地)为Scrapy构建我的XPath表达式(在python中) - 我看到了构建我的Xpath的两种不同方法 . 我知道对于特定的Xpath / HTML层次结构,可以有许多可能的方法来构建XPath,以便能够提取/删除感兴趣的元素 . 我也明白你可以生成绝对/相对Xpath(在Firepath中)

进一步来说 -

示例用例 - 试图在ebay scrapy shell上刮取页面http://www.ebay.com/sch/Coats-Jackets-/57988/i.html - 使用Xpath检查器 - [工作正常,删除tbody后来自XPath]] 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 . 选择( “.//[@ ID = 'ResultSetItems'] /表[1] / TR / TD [1] / DIV / DIV / DIV / DIV / DIV [2] / H4 /一个/ @ HREF”) . 提取物() - 在Firepath中使用绝对路径 - [无法工作,即使从XPath中删除tbody后] XPath = = html / body / div [5] / div [2] / div [3] / div [1] / DIV / DIV / DIV [2] / DIV / DIV [6] / DIV /表[1] / tbody的/ TR / TD [1] / DIV / DIV / DIV / DIV / DIV [2] / H4 /一个/ @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 /一个/ @小时ef“) . extract()即使在删除tbody之后也不起作用请注意,只有在我从XPath中明确删除”tbody“之后才能看到响应,但这不适用于通过Firepath生成的绝对路径 .

Q1: 为什么我需要删除"tbody",如果还有其他这样的元素,firefox会在XPath的中间附加/插入,除了tbody我应该在尝试获取响应(使用hxs.select)/构建我的项目管道之前删除 .

我找到了一个可能的解释:"Firefox, in particular, is known for adding elements to tables. Scrapy, on the other hand, does not modify the original page HTML, so you won’t be able to extract any data if you use in your XPath expressions. "来源:Firefox,另见:Parsing HTML with XPath, Python and Scrapy

Q2: 在FirePath窗格中读取绝对路径时,即使删除tbody后响应也不起作用 - 为什么会这样?

Q3 : Firebug和XPath检查器之间的哪两个更好地工作(阅读更健壮/一致)是否有最佳实践 - 如果是,为什么和哪一个?

Q4 无关:有些人建议在构建XPath时在浏览器上禁用Javascript,这是否相关并且禁用JavaScript作为标准做法?在刮擦(如果有的话)时不这样做的后果是什么?

Related - Xpath Table Within Table Parsing HTML with XPath, Python and Scrapy

1 回答

  • 1

    Q1

    通过浏览器添加 tbody 标记是一种遵循HTML4 specification的方式:

    <!ELEMENT TABLE - -
         (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
    <!ATTLIST TABLE                        -- table element --
      %attrs;                              -- %coreattrs, %i18n, %events --
      summary     %Text;         #IMPLIED  -- purpose/structure for speech output--
      width       %Length;       #IMPLIED  -- table width --
      border      %Pixels;       #IMPLIED  -- controls frame width around table --
      frame       %TFrame;       #IMPLIED  -- which parts of frame to render --
      rules       %TRules;       #IMPLIED  -- rulings between rows and cols --
      cellspacing %Length;       #IMPLIED  -- spacing between cells --
      cellpadding %Length;       #IMPLIED  -- spacing within cells --
      >
    

    换句话说, tr 元素不能是规范的 table 的直接子元素 . 浏览器在看到它丢失时插入 tbody . 另一方面,HTML5允许这样做 . 浏览器现在只是为了向后兼容而保留它 .

    也可以看看:

    通常,您应该只关注 tbody ,但理论上,浏览器可以更改/注入/修复页面的html以使其正常工作 .

    Q2

    这个特定的ebay页面使用js动态加载内容 . Scrapy在“Body”div(div [5])中只看到1个div:

    >>> hxs.select('//html/body/div[5]/div').extract()
    [u'<div id="showDiagContainer">\r\n</div>']
    

    其他div通过ajax请求加载 . 通常,这是Scrapy的一个问题,您必须处理并找到解决方法 . 两个选项:在蜘蛛中模拟这些ajax调用或切换到浏览器内的工具,如selenium(或将其与Scrapy结合使用) .

    也可以看看:

    Q3

    这真的取决于你 . 如果你将继续使用Scrapy - 那么,只需在Xpath检查器或FirePath中构建xpath并在scrapy shell中检查它 - 这很重要 .

    Q4

    我会这样回答:禁用JS并加载这个易趣页面 - 你看到你想要刮掉什么吗?

    希望有所帮助 .

相关问题