Beautiful Soup的XML解析器无法处理布尔属性?

时间:2018-11-08 13:58:17

标签: python xml beautifulsoup

在下面的文档中,是否可以使用Beautiful Soup的XML解析器获取正确的文本字段?

<!DOCTYPE html>
<html>

<body>
  <header class="site-header" itemscope itemtype="http://schema.org/WPHeader">
    <div>
      <p>Lorem ipsum</p>
    </div>
  </header>

  <div>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac tempus magna. Morbi maximus enim eu dolor ultricies, quis vestibulum lacus finibus. Maecenas sed fermentum nisi. Sed nec dignissim mi. Curabitur vel magna faucibus, ultrices tortor quis,
      gravida metus. Fusce in nisi et ligula feugiat pharetra. Nam sed sapien auctor, egestas sem nec, hendrerit libero. Nulla in semper ligula. Vivamus commodo pulvinar luctus. In ac vehicula felis. In nec bibendum nulla.</p>
  </div>

</body>

</html>

问题在于布尔值itemscope的存在会强制itemtype属性及其值移入文本节点:

from bs4 import BeautifulSoup

with open('bs4-issue-xml.html', 'r') as f:
    html_raw = ''.join(f.read())

soup_lxml = BeautifulSoup(html_raw, 'lxml')
soup_xml = BeautifulSoup(html_raw, 'xml')

assert 'schema.org' not in soup_lxml.header.text
assert 'schema.org' not in soup_xml.header.text  # assertion fails

以下是结转到header.text中的内容:

In [44]: soup_xml.header.text                                                                         
Out[44]: 'itemtype="http://schema.org/WPHeader">\n    \nLorem ipsum\n\n'

official docs claim xml解析器是“当前唯一支持的XML解析器”,但是除非它们位于最后位置,否则它似乎无法处理常见的HTML5布尔属性。我不能站在一边(整个问题都有网络抓取上下文)。对于这种特定的解析器,是否有解决方法/修复程序?

注意:很明显,我知道lxml解析器(或lxml本身)在这种情况下可以正常工作,我只对使用{其他原因,在《美丽的汤》中有{1}}解析器。

0 个答案:

没有答案