下面的文档中有没有一种方法可以通过Beauty 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
parser被认为是“目前唯一受支持的XML解析器”,但它似乎无法处理常见的HTML5布尔属性,除非它们位于最后一个位置,这是我无法解决的问题(整个问题有一个网络抓取上下文)。对于这个特定的解析器,是否有变通/修复方法?
笔记
:显然,我知道
lxml
解析器(或
lxml
在这种情况下,它本身可以正常工作,我只对使用
xml
还有其他原因。