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中的xpath在html中导航_Python_Xpath - Fatal编程技术网

通过python中的xpath在html中导航

通过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

因此,我正在访问一些url,其格式如下:

<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进行检查,看看它是否抛出错误