通过python中的xpath在html中导航
因此,我正在访问一些url,其格式如下:通过python中的xpath在html中导航,python,xpath,Python,Xpath,因此,我正在访问一些url,其格式如下: <DOCUMENT> <TYPE>A <SEQUENCE>1 <TEXT> <HTML> <BODY BGCOLOR="#FFFFFF" LINK=BLUE VLINK=PURPLE> </BODY> </HTML> </TEXT> </DOCUMENT> <DOCUMENT> <TY
<DOCUMENT>
<TYPE>A
<SEQUENCE>1
<TEXT>
<HTML>
<BODY BGCOLOR="#FFFFFF" LINK=BLUE VLINK=PURPLE>
</BODY>
</HTML>
</TEXT>
</DOCUMENT>
<DOCUMENT>
<TYPE>B
<SEQUENCE>2
...
然而,它只是给了我一个空列表作为变量类型
有人能告诉我这个密码有什么错误吗?我对这种xml内容真的很陌生。尝试使用相对路径:显式指定元素的正确路径。不跳过类型
见:
输出:
Trying original post (novice_007): //document[sequence=1]/descendant::*/text()
[]
Using GKFX's answer: //DOCUMENT[starts-with(SEQUENCE,'1')]
[]
My answer: //document[./type/sequence = 1]
[<Element document at 0x1bfcb30>]
目前,我提供的xpath是唯一一个。。。要仅获取序列值为1的文档,请尝试使用相对路径:显式指定元素的正确路径。不跳过类型
见:
输出:
Trying original post (novice_007): //document[sequence=1]/descendant::*/text()
[]
Using GKFX's answer: //DOCUMENT[starts-with(SEQUENCE,'1')]
[]
My answer: //document[./type/sequence = 1]
[<Element document at 0x1bfcb30>]
目前,我提供的xpath是唯一一个。。。要仅获取序列值为1的文档,可能是因为它是高度可疑的HTML。标记是未关闭的,因此lxml很可能会将其解释为包含下一个标记之前的所有代码,因此它不会只包含1。然后,当XPath代码查找包含1的值时,没有包含1的值 此外,XML区分大小写,但HTML不区分大小写。XPath是为XML设计的,因此它也是区分大小写的,这也会停止文档匹配 请尝试//文档[以“1”开头]。这是基于
理想情况下,如果输入在您的控制之下,您应该只使用和关闭类型和序列标记,以使输入有效。可能是因为这是非常可疑的HTML。标记是未关闭的,因此lxml很可能会将其解释为包含下一个标记之前的所有代码,因此它不会只包含1。然后,当XPath代码查找包含1的值时,没有包含1的值 此外,XML区分大小写,但HTML不区分大小写。XPath是为XML设计的,因此它也是区分大小写的,这也会停止文档匹配 请尝试//文档[以“1”开头]。这是基于
理想情况下,如果输入在您的控制之下,您应该只使用和关闭类型和序列标记,以使输入有效。我想指出,除了@GKFX提供的很好的答案之外,lxml.html模块还能够解析断开的html或html片段。事实上,它可以很好地从字符串中解析并处理好它 fromstringstring:从字符串或 fragment_fromstring,基于字符串是否看起来像一个完整的 文档,或者只是一个片段 您的问题(可能来自生成字符串的其他代码)还在于,您没有给出访问序列节点的真实路径 上面的xpath将尝试查找具有以下子节点的所有文档节点,该子节点名为sequence,其值为1,但是文档的第一个子节点是type,而不是sequence,因此您永远不会得到想要的结果 考虑重写此,将获得您需要的:
page.xpath('//document[type/sequence=1]/descendant::*/text()')
['A\n ', '1\n ']
由于html字符串缺少sequence的结束标记,因此您无法通过另一个xpath获得正确的结果,如下所示:
page.xpath('//document[type/sequence=1]/../..//text()')
['A\n ', '1\n ', 'B\n ', '2']
这是因为sequence=1没有结束标记,sequence=2将成为它的子节点
我必须指出一点,您的html字符串仍然是无效的,但是lxml解析器的容忍度可以很好地处理您的情况。我想指出的是,除了@GKFX提供的很好的答案外,lxml.html模块还能够解析断开的html或html片段。事实上,它可以很好地从字符串中解析并处理好它 fromstringstring:从字符串或 fragment_fromstring,基于字符串是否看起来像一个完整的 文档,或者只是一个片段 您的问题(可能来自生成字符串的其他代码)还在于,您没有给出访问序列节点的真实路径 上面的xpath将尝试查找具有以下子节点的所有文档节点,该子节点名为sequence,其值为1,但是文档的第一个子节点是type,而不是sequence,因此您永远不会得到想要的结果 考虑重写此,将获得您需要的:
page.xpath('//document[type/sequence=1]/descendant::*/text()')
['A\n ', '1\n ']
由于html字符串缺少sequence的结束标记,因此您无法通过另一个xpath获得正确的结果,如下所示:
page.xpath('//document[type/sequence=1]/../..//text()')
['A\n ', '1\n ', 'B\n ', '2']
这是因为sequence=1没有结束标记,sequence=2将成为它的子节点
我必须指出一点,您的html字符串仍然无效,但lxml解析器的容忍度可以很好地处理您的情况。这是我第一次实际使用Python或XPath,因此这仅基于html/XML的经验。+1非常可疑的html-正是如此。是的,XPath是区分大小写的。非常感谢@GKFX。我同意这是一个奇怪的问题。不幸的是,我无法控制代码。[我在问题的评论中提供了一个链接]不幸的是,您的代码没有很好地工作。这很奇怪,因为xpath将序列识别为节点,所以
当我输入://sequence/genderant::*/text时,它会识别正确的位置。但正如您所提到的,当它完成时,它不会被理解。这是我第一次实际使用Python或XPath,所以这仅仅是基于HTML/XML的经验。+1非常可疑的HTML-确切地说。是的,XPath是区分大小写的。非常感谢@GKFX。我同意这是一个奇怪的问题。不幸的是,我无法控制代码。[我在问题的评论中提供了一个链接]不幸的是,您的代码没有很好地工作。这很奇怪,因为xpath将序列识别为节点,所以当我放置://sequence/genderant::*/text时,它会识别正确的位置。但是,正如您所提到的,当它完成时,它不会得到您作为输入的内容既不是HTML也不是任何类型的XML。是你自己写的吗?@MathiasMüller:不,我确实没有!下面是一个我试图抓取的URL示例:它相当长,所以我没有将它包括在我的问题中。您输入的既不是HTML,也不是任何类型的XML。是你自己写的吗?@MathiasMüller:不,我确实没有!下面是一个我正在尝试爬网的URL示例:这是一个相当长的URL,因此我没有将其包含在我的问题中。路径表达式如何比OP中的表达式更相关?路径表达式如何比OP中的表达式更相关?非常感谢,@Anzel。但还是没有机会。您的代码将[]作为well@novice_007,它在我的机器上运行得很好,这让我相信你的html解析器可能不知怎么坏了。您确定已安装libxml2吗?您可以使用python-cimportlibxml2进行检查,看看它是否抛出错误。非常感谢,@Anzel。但还是没有机会。您的代码将[]作为well@novice_007,它在我的机器上运行得很好,这让我相信你的html解析器可能不知怎么坏了。您确定已安装libxml2吗?您可以使用python-cimportlibxml2进行检查,看看它是否抛出错误