在下面的文档中,是否可以使用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}}解析器。