python lxml

时间:2020-02-23 14:42:59  来源:igfitidea点击:

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))