Python lxml';s XPath未找到<;ul>;在<;p>;标签
我对pythons lxml的XPath函数有一个问题。以下python代码是一个简单的示例:Python lxml';s XPath未找到<;ul>;在<;p>;标签,python,xpath,lxml,Python,Xpath,Lxml,我对pythons lxml的XPath函数有一个问题。以下python代码是一个简单的示例: from lxml import html, etree text = """ <p class="goal"> <strong>Goal</strong> <br /> <ul><li>test</li></ul> </p
from lxml import html, etree
text = """
<p class="goal">
<strong>Goal</strong> <br />
<ul><li>test</li></ul>
</p>
"""
tree = html.fromstring(text)
thesis_goal = tree.xpath('//p[@class="goal"]')[0]
print etree.tostring(thesis_goal)
从lxml导入html,etree
text=”“”
目标
- 测试
"""
tree=html.fromstring(文本)
论文目标=tree.xpath('//p[@class=“goal”]')[0]
打印etree.tostring(论文目标)
运行代码会产生
<p class="goal">
<strong>Goal</strong> <br/>
</p>
目标
如您所见,整个
块丢失。这也意味着不可能使用沿着//p[@class=“goal”]/ul
行的XPath来处理
,因为
不算作
的子级
这是lxml的一个bug还是一个功能,如果是后者,我如何访问
的全部内容?这个东西被嵌入到一个更大的网站中,甚至不能保证会有一个
标签(里面可能有另一个
,或者其他任何东西)
更新:在收到答案后更新标题,使具有相同问题的人更容易找到此问题。ul
元素(或更一般的)是(只能包含)。因此lxml.html
将text
解析为
In [45]: print(html.tostring(tree))
<div><p class="goal">
<strong>Goal</strong> <br>
</p><ul><li>test</li></ul>
</div>
ul
元素(或更一般的)是(只能包含)。因此lxml.html
将text
解析为
In [45]: print(html.tostring(tree))
<div><p class="goal">
<strong>Goal</strong> <br>
</p><ul><li>test</li></ul>
</div>
@unutbu具有正确的anwser。您的HTML无效,HTML解析器将产生意外结果。正如lxml文档中所说 对解析破坏的HTML的支持完全依赖于libxml2的 恢复算法。如果您找到文档,这不是lxml的错 它们被严重破坏,以至于解析器无法处理它们。那里 也不能保证生成的树将包含所有数据 从原始文件中删除。解析器可能不得不严重中断 无法继续解析时出现断开的部分。特别是放错地方了 元标记可能会遇到这种情况,这可能会导致编码问题 根据您试图实现的目标,您可以回退到xml解析器
# Changing html to etree here will produce behaviour you expect
tree = etree.fromstring(text)
或者移动到更高级的网站解析包,例如BeautifulSoup4,unutbu有正确的anwser。您的HTML无效,HTML解析器将产生意外结果。正如lxml文档中所说 对解析破坏的HTML的支持完全依赖于libxml2的 恢复算法。如果您找到文档,这不是lxml的错 它们被严重破坏,以至于解析器无法处理它们。那里 也不能保证生成的树将包含所有数据 从原始文件中删除。解析器可能不得不严重中断 无法继续解析时出现断开的部分。特别是放错地方了 元标记可能会遇到这种情况,这可能会导致编码问题 根据您试图实现的目标,您可以回退到xml解析器
# Changing html to etree here will produce behaviour you expect
tree = etree.fromstring(text)
或者移动到更高级的网站解析包,例如BeautifulSoup4