python-XPath查找文本和树迭代

这是一个关于使用lxml.etree进行XML处理的教程。它简要概述了ElementTree API的主要概念,以及一些简单的增强功能,使您作为程序员的生活更轻松。

有关API的完整参考,请参阅生成的API文档。

内容

本文章主要介绍的是使用XPath查找文本和树迭代

使用XPath查找文本

提取树的文本内容的另一种方法是XPath,它还允许您将单独的文本块提取到列表中:

打印(HTML 。XPath的(“字符串()” )) 仅#lxml.etree!
TEXTTAIL

打印(HTML 。XPath的(“//文本()” )) 仅#lxml.etree!
[‘TEXT’,‘TAIL’]
如果你想更频繁地使用它,你可以将它包装在一个函数中:

build_text_list = etree 。XPath (“// text()” ) #lxml.etree!
print (build_text_list (html ))
[‘TEXT’,‘TAIL’]
请注意,XPath返回的字符串结果是一个特殊的“智能”对象,它知道它的来源。您可以通过其getparent()方法询问它的来源,就像使用Elements一样:

texts = build_text_list (html )
print (texts [ 0 ])
TEXT

parent = texts [ 0 ] 。的getParent ()
印刷(父。标签)
的身体

打印(文本[ 1 ])
TAIL

打印(文本[ 1 ] 。的getParent () 。标签)
BR
您还可以查看它是正常的文本内容还是尾部文本:

打印(文本[ 0 ] 。is_text )

打印(文本[ 1 ] 。is_text )

打印(文本[ 1 ] 。is_tail )

虽然这适用于text()函数的结果,但lxml不会告诉您由XPath函数string()或concat()构造的字符串值的来源:

stringify = etree 。XPath的(“字符串()” )
印刷(字符串化(HTML ))
TEXTTAIL

打印(字符串化(HTML )。的getParent ())

欢迎各位加入小编的技术交流群

树迭代

对于上述问题,您希望以递归方式遍历树并对其元素执行某些操作,树迭代是一种非常方便的解决方案。元素为此提供了树迭代器。它按文档顺序生成元素,即按照将树序列化为XML时其标记的顺序:

root = etree 。元素(“根” )
etree 。子元素(root , “child” )。text = “Child 1”
etree 。子元素(root , “child” )。text = “Child 2”
etree 。子元素(root , “另一个” )。text = “孩子3”
打印(etree 。的toString (根, pretty_print = 真))
<根>
<孩子>儿童1
<孩子>子2
<另一>子3

为 元件 在 根。iter ():
… print (“ %s - %s ” % (元素。标记, 元素。文本))
root - 无
子项 - 子项1
子项 - 子项2项
另一项 - 子项3
如果您知道自己只对单个标记感兴趣,可以将其名称传递给 iter()以让它过滤。从lxml 3.0开始,您还可以在迭代期间传递多个标记以拦截多个标记。

为 元件 在 根。ITER (“子” ):
… 打印(“ %S - %S ” % (元素,标签, 元素。文本))
儿童-儿童1名
儿童-儿童2

为 元件 在 根。iter (“另一个” , “孩子” ):
… print (“ %s - %s ” % (元素。标签, 元素。文本))
孩子 - 孩子1
孩子 - 孩子2
另一个孩子- 孩子3
默认情况下,迭代会生成树中的所有节点,包括ProcessingInstructions,Comments和Entity实例。如果要确保仅返回Element对象,可以将Element工厂作为标记参数传递 :

root 。追加(etree 。实体(“#234” ))
root 。追加(etree 。评论(“一些评论” ))
为 元件 在 根。国际热核实验堆():
… 如果 isinstance (元素,标签, 即basestring ): #或在Python 3 ‘STR’
… 打印(“ %S - %S ” % (元素,标签, 元素。文本))
… 。 其他:
… 打印(“SPECIAL:%S - %S ” % (元素, 元素。文本))
根 - 没有
孩子 - 孩子1
孩子 - 孩子2
另一个
孩子- 孩子3 特别:&#234; - &#234;
特别:<! - 一些评论 - > - 一些评论

为 元件 在 根。ITER (标签= etree 。元素):
… 打印(“ %S - %S ” % (元素。标签, 元素。文本))
根-没有
子-子1
子-子2
另一个-儿童3

为 元件 在 根。国际热核实验堆(标签= etree 。实体):
… 打印(元素。文本)
&#234;
请注意,传递通配符“*”标记名称也将产生所有 Element节点(并且仅包含元素)。

在lxml.etree中,元素为树中的所有方向提供了进一步的迭代器:子节点,父节点(或者更确切地说是祖先节点)和兄弟节点。

如果大家没有找到一个好的技术交流群或者需要关于python的资料的如1.爬虫库–requests,bs4,lxml,scrapy,pyspider2.python开发—Django,Tornado,flask框架3.linux,shell脚本4.selenium自动化测试5.自动化运维Zabbix6.数据库 MySql,NoSql,redis正则表达式re,网络编程,面向对象,lambda,IO并发编程,GUI图形

可以加入小编的群418775537

你可能感兴趣的:(Python)