Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lxml';s XPath未找到<;ul>;在<;p>;标签_Python_Xpath_Lxml - Fatal编程技术网

Python lxml';s XPath未找到<;ul>;在<;p>;标签

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

我对pythons lxml的XPath函数有一个问题。以下python代码是一个简单的示例:

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