python lxml
Python lxml是功能最丰富且易于使用的库,用于处理XML和HTML数据。
编写Python脚本是为了执行许多任务,例如Web抓取和解析XML。
在本程序中,我们将研究python lxml库以及如何使用它解析XML数据并执行Web抓取。
Python lxml库
Python lxml是易于使用且功能丰富的库,用于处理和解析XML和HTML文档。
lxml是一个非常不错的API,因为它提供了处理这两种数据类型的所有内容。
使lxml脱颖而出的两个要点是:
- 易于使用:它比现有的任何其他库都具有非常简单的语法
- 性能:处理大型XML文件所需的时间非常少
Python lxml安装
我们可以通过使用pip工具将其作为python软件包安装来开始使用lxml:
pip install lxml
安装完此工具后,我们就可以从简单的示例开始。
创建HTML元素
使用lxml,我们也可以创建HTML元素。
元素也可以称为节点。
让我们仅使用库来创建HTML页面的基本结构:
from lxml import etree root_elem = etree.Element('html') etree.SubElement(root_elem, 'head') etree.SubElement(root_elem, 'title') etree.SubElement(root_elem, 'body') print(etree.tostring(root_elem, pretty_print=True).decode("utf-8"))
运行此脚本时,我们可以看到正在形成HTML元素:我们可以看到正在形成HTML元素或者节点。
" pretty_print"参数有助于打印缩进版HTML文档。
这些HTML元素基本上是一个列表。
我们可以正常访问此列表:
html = root_elem[0] print(html.tag)
这将只打印head
,因为那是html标签中存在的标签。
我们还可以打印root标记内的所有元素:
for element in root_elem: print(element.tag)
检查HTML元素的有效性
使用iselement()
函数,我们甚至可以检查给定元素是否为有效HTML元素:
print(etree.iselement(root_elem))
在HTML元素中使用属性
通过将属性添加到我们制作的元素中,我们可以将元数据添加到我们构造的每个HTML元素中:
from lxml import etree html_elem = etree.Element("html", lang="en_GB") print(etree.tostring(html_elem))
运行此命令时,我们看到:现在可以按以下方式访问这些属性:
print(html_elem.get("lang"))
值会显示在控制台上:请注意,对于给定HTML元素,该属性不存在,我们将获得"无"作为输出。
我们还可以将HTML元素的属性设置为:
html_elem.set("best", "theitroad") print(html_elem.get("best"))
当我们打印值时,我们得到了预期的结果:
带有值的子元素
我们上面构造的子元素是空的,这没什么好玩的!让我们使用lxml库制作一些子元素并其中添加一些值。
from lxml import etree html = etree.Element("html") etree.SubElement(html, "head").text = "Head of HTML" etree.SubElement(html, "title").text = "I am the title!" etree.SubElement(html, "body").text = "Here is the body" print(etree.tostring(html, pretty_print=True).decode('utf-8'))
馈送RAW XML以进行序列化
我们可以直接将RAW XML数据提供给etree并对其进行解析,也可以完全理解传递给它的内容。
from lxml import etree html = etree.XML('<html><head>Head of HTML</head><title>I am the title!</title><body>Here is the body</body></html>') print(etree.tostring(html, pretty_print=True).decode('utf-8'))
让我们看一下输出:如果您希望数据包括根XML标签声明,甚至可以:
from lxml import etree html = etree.XML('<html><head>Head of HTML</head><title>I am the title!</title><body>Here is the body</body></html>') print(etree.tostring(html, xml_declaration=True).decode('utf-8'))
Python LXML etree parse()函数
parse()函数可用于从文件和类似文件的对象中进行解析:
from lxml import etree from io import StringIO title = StringIO("<title>Title Here</title>") tree = etree.parse(title) print(etree.tostring(tree))
Python LXML etree fromstring()函数
fromstring()函数可用于解析字符串:
from lxml import etree title = "<title>Title Here</title>" root = etree.fromstring(title) print(root.tag)
Python lxml etree XML()函数
fromstring()函数可用于将XML文字直接写入源代码:
from lxml import etree title = etree.XML("<title>Title Here</title>") print(title.tag) print(etree.tostring(title))