【问题标题】:Behavior of the scrapy xpath selector on h1-h6 tagsscrapy xpath 选择器在 h1-h6 标签上的行为
【发布时间】:2017-04-25 03:24:20
【问题描述】:

为什么下面两个代码 sn-ps 给出不同的输出?它们之间的唯一区别是第一种情况下的h1 标记在第二种情况下被替换为h 标记。这是因为h1标签在html中有特殊的“含义”吗?我尝试使用h1h6,它们都将[] 作为输出,而使用h7 它开始将[u'xxx'] 作为输出。

from scrapy import Selector # scrapy version: 1.2.2

text = '<h1><p>xxx</p></h1>'
print Selector(text=text).xpath('//h1/p/text()').extract()
Output[1]: []

text = '<h><p>xxx</p></h>'
print Selector(text=text).xpath('//h/p/text()').extract()
Output[2]: [u'xxx']

【问题讨论】:

    标签: python html xpath scrapy selector


    【解决方案1】:

    根据 W3C,在 h# 中包含 p 标记是无效的。你可以看到更多关于这个here

    无论如何,要绕过这个并使用任何xml 结构,您可以像这样更改type

    sel = Selector(text="anyxml", type="xml")
    

    这将尊重任何 xml 结构。

    【讨论】:

      【解决方案2】:

      简短的回答是h1..h6 不应该在格式良好的 HTML 文档中包含 &lt;p&gt;,至少 lxml(支持 Scrapy 选择器)在解析 HTML 时不喜欢这样。 lxml 确实处理了错误的格式,但这种情况有点不同。

      您可以检查 lxml 如何解析和序列化回 HTML sn-p:

      >>> from scrapy import Selector
      >>> text = '<h1><p>xxx</p></h1>'
      >>> s = Selector(text=text)
      >>> print(s.extract())
      <html><body><h1></h1><p>xxx</p></body></html>
      

      所以当 lxml 在h1 中遇到p 标记时,它会将它放在它之后。 p 元素没有丢失,但它不是您在阅读 HTML 源代码时所期望的位置。

      vs 其他 sn-p:

      >>> text = '<h><p>xxx</p></h>'
      >>> s = Selector(text=text)
      >>> print(s.extract())
      <html><body><h><p>xxx</p></h></body></html>
      >>> 
      

      h 元素对于 lxml 没有任何特殊意义,因此“p inside h”是ok

      【讨论】:

      • 感谢您展示 print(s.extract()) 告诉我们引擎盖下的内容!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2020-04-23
      相关资源
      最近更新 更多