代码之家  ›  专栏  ›  技术社区  ›  pandita

Scrapy和xpath怪异-自动添加标记、轴和步骤?

  •  2
  • pandita  · 技术社区  · 6 年前

    我很难理解如何在scrapy中使用xpath的一些细节。例如。:

    额外的html正文填充我没有添加

    from scrapy.selector import Selector
    t = '<a href="123">qwer</a>'
    sel = Selector(text=t)
    
    sel.extract()
    # returns: <html><body><a href="123">qwer</a></body></html>
    

    html正文标记填充从何而来?

    sel.xpath('html').extract()  # returns [], ok
    sel.xpath('body').extract()  # returns '<body><a ...' ?????
    sel.xpath('a').extract()     # returns [], ok?
    

    为什么不使用“/”就可以选择“body”?我在一个项目中有类似的行为。

    还包括以下内容:

    sel.xpath('//body').extract()  # returns '<body>...', ok
    sel.xpath('//body').xpath('/body').extract()
    # this returns []. 
    

    为什么xpath链返回的结果与第一行不一样?在这两种情况下,选择者似乎是相同的?第二个xpath调用不应该在新根上工作吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   John Smith    6 年前

    Scrapy选择器使用 lxml.html 解析器解析输入文本,当lxml接收到非完整html(html片段)时,它总是将其包装成一个完整的html文档树,我相信这与web浏览器的工作方式是一样的。

    Xpath表达式的工作原理与基本文件系统路径表达式类似,例如 /home/john/Downloads/file.pdf Downloads/file.pdf ./Downloads/file.pdf ).

    简单的XPath表达式,例如 body 也与 ./body <body> 应该是当前节点的直接子级的元素。点是指当前节点,单斜杠是指它下面的一级(双斜杠是指下面的任何一级)。

    <html> 节点)。根节点没有直接子元素 <html> 所以 xpath('html') 什么都不给你。根节点没有直接 <车身> xpath('body') 就这样。根节点没有直接 <a> 孩子如此 xpath('a') xpath('.//a') ).

    xpath('//body').xpath('/body') / // (两个都是绝对路径)指示求值器开始相对于文档的根查找,而不考虑您当前所在的位置。所以您的表达式是:在文档中的任意位置查找body元素,然后查找body元素,body元素必须位于最顶部(除了顶部只有一个元素,即 <html>