前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >lxml网页抓取教程

lxml网页抓取教程

原创
作者头像
用户7850017
修改于 2021-10-15 09:51:22
修改于 2021-10-15 09:51:22
4K00
代码可运行
举报
运行总次数:0
代码可运行

使用lxml处理XML及网页抓取

在本教程中,我们会学习lxml库和创建XML文档的基础知识,然后会处理XML和HTML文档。最后,我们将利用以上所学,融会贯通,看看如何使用lxml提取数据。本教程的每一步都配有实用的Python lxml示例。

阅读人群

​本教程适用于对Python、XML和HTML有基本的了解的开发人员。简单地说,如果您知道XML中的属性是什么,那么就足以理解本文。

本教程使用Python3代码段,但所有内容都可以在Python2上运行,只需进行少量更改。

Python中的lxml是什么?

lxml是在Python中处理XML和HTML最快且功能丰富的库之一。该库本质上是C库libxml2和libxslt的封装。因此结合了C库的速度和Python的简单性。

使用Python lxml库,可以创建、解析和查询XML和HTML文档。它依赖于许多其他复杂的包,如Scrapy。

#安装

下载和安装lxml库的最佳方法是去Python Package Index(PyPI)下载

如果您使用的是Linux(基于debian),只需运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  sudo apt-get install python3-lxml

另一种方法是使用pip包管理器这适用于Windows、Mac和Linux:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  pip3 install lxml

在Windows上,假设您正在运行Python3,只需使用pip install lxml。

#创建一个简单的XML文档

任何XML或任何符合XML的HTML都可以看作一棵树。一棵树有根和树枝。树的每个分支可以具有更多分支。所有这些分支和根都分别表示一个Element。

一个非常简单的XML文档如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<root>
      <branch>
          <branch_one>
          </branch_one>
          <branch_one>
          </branch_one>
     <branch>
</root>

如果HTML是兼容XML的,它将遵循相同的概念。

请注意,HTML可能兼容也可能不兼容XML。例如,如果HTML的<br>没有相应的结束标记,它仍然是有效的HTML,但它不会是有效的XML。

在本教程的后半部分,我们将看看如何处理这些情况。接下来让我们专注于兼容XML的HTML。

#元素类

使用python lxml创建XML文档,第一步是导入lxml的etree模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> from lxml import etree

每个XML文档都以根元素开始。可以使用元素类型创建。元素类型是一个灵活的容器对象,可以存储分层数据。可以描述为字典和列表之间的交叉。

在这个python lxml示例中,目标是创建一个兼容XML的HTML。这意味着根元素的名称将是html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> root = etree.Element("html")

同样,每个html都会有一个头部和一个主体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> head = etree.Element("head")
>>> body = etree.Element("body")

要创建父子关系,我们可以简单地使用append()方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> root.append(head)
>>> root.append(body)

tostring()函数的帮助下,这个文档可以被序列化并输出到终端。此函数需要一个强制参数,即文档的根。我们可以选择将pretty_print设置为True以使输出更具可读性。

请注意,tostring()序列化程序会实际返回字节。这可以通过调用decode()转换为字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> print(etree.tostring(root, pretty_print=True).decode())

#子元素类

创建一个Element对象并调用append()函数会使代码变得混乱和不可读。最简单的方法是使用SubElement类型。它的构造函数有两个参数——父节点和元素名称。使用SubElement,以下两行代码可以替换为一行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
body = etree.Element("body")
root.append(body)
# is same as
body = etree.SubElement(root,"body")

#设置文本和属性

使用lxml库设置文本非常容易。ElementSubElement的每个实例都公开了两个方法——textset,前者用于指定文本,后者用于设置属性。以下是示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
para = etree.SubElement(body, "p")
para.text="Hello World!"

同样,可以使用键值约定设置属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
para.set("style", "font-size:20pt")

要注意的是,可以在SubElement的构造函数中传递该属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
para = etree.SubElement(body, "p", style="font-size:20pt", id="firstPara")
para.text = "Hello World!"

这种方法的节省了代码行数,代码可读性也更强。这是完整的代码。将它保存在一个python文件中并运行它。它将输出一个HTML,它也是一个格式良好的XML。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from lxml import etree

root = etree.Element("html")
head = etree.SubElement(root, "head")
title = etree.SubElement(head, "title")
title.text = "This is Page Title"
body = etree.SubElement(root, "body")
heading = etree.SubElement(body, "h1", style="font-size:20pt", id="head")
heading.text = "Hello World!"
para = etree.SubElement(body, "p",  id="firstPara")
para.text = "This HTML is XML Compliant!"
para = etree.SubElement(body, "p",  id="secondPara")
para.text = "This is the second paragraph."

etree.dump(root)  # prints everything to console. Use for debug only

请注意,这里我们使用了etree.dump()而不是调用etree.tostring()。不同之处在于dump()只是将所有内容写入控制台而不返回任何内容,tostring()用于序列化并返回一个字符串,您可以将其存储在变量中或写入文件。dump()仅适用于调试,不应用于任何其他目的。

在代码段的底部添加以下几行并再次运行它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open(‘input.html’, ‘wb’) as f:
f.write(etree.tostring(root, pretty_print=True)

代码会将内容保存到您运行脚本的同一文件夹中的input.html。同样,这是一个格式良好的XML,可以看作XML或HTML。

如何在Python中使用LXML

解析XML文件?

上一节是关于创建XML文件的Python lxml教程。在本节中,我们将研究如何使用lxml库遍历和操作现有的XML文档。

在我们继续之前,将以下代码段保存为input.html。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
    <head>
      <title>This is Page Title</title>
    </head>
    <body>
       <h1 style="font-size:20pt" id="head">Hello World!</h1>
       <p id="firstPara">This HTML is XML Compliant!</p>
       <p id="secondPara">This is the second paragraph.</p>
    </body>
</html>

解析XML文档时,结果是内存中的ElementTree对象。

原始XML内容可以在文件系统或字符串中。如果它在文件系统中,则可以使用parse方法加载它。请注意,parse方法将返回一个ElementTree类型的对象。要获取根元素,只需调用getroot()方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from lxml import etree

tree = etree.parse('input.html')
elem = tree.getroot()
etree.dump(elem) #prints file contents to console

lxml.etree模块公开了另一种可用于有效解析xml字符串中内容的方法—fromstring()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml ='<html><body>Hello</body></html>'
root = etree.fromstring(xml)
etree.dump(root)

这里要注意的一个重要区别是fromstring()方法会返回一个元素对象。无需调用getroot()。

如果您想深入了解解析,可以查看BeautifulSoup教程的详细内容:

这是一个用于解析HTML和XML文档的Python包。但是为了快速回答BeautifulSoup中的lxml是什么,lxml可以使用BeautifulSoup作为解析器后端。同样,BeautifulSoup可以使用lxml作为解析器。

在XML中查找元素

从广义上讲,有两种使用Python lxml库查找元素的方法。第一种是使用Python lxml查询语言:XPath和ElementPath。例如,以下代码将返回第一个段落元素。

请注意,选择器与XPath非常相似。另请注意,未使用根元素名称,因为elem包含XML树的根。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tree = etree.parse('input.html')
elem = tree.getroot()
para = elem.find('body/p')
etree.dump(para)

# Output
# <p id="firstPara">This HTML is XML Compliant!</p>

类似地,findall()将返回与选择器匹配的所有元素的列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
elem = tree.getroot()
para = elem.findall('body/p')
for e in para:
    etree.dump(e)
 
# Outputs
# <p id="firstPara">This HTML is XML Compliant!</p>
# <p id="secondPara">This is the second paragraph.</p>

选择元素的第二种方法是直接使用XPath。熟悉XPath的开发人员更容易使用这种方法。此外,XPath可用于使用标准XPath语法返回元素的实例、文本或任何属性的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
para = elem.xpath('//p/text()')
for e in para:
    print(e)

# Output
# This HTML is XML Compliant!
# This is the second paragraph.

使用lxml.html处理HTML

在本文中,我们一直在使用兼容XML的格式良好的HTML。很多时候情况并非如此。对于这些场景,您可以简单地使用lxml.html而不是lxml.etree。

请注意,不支持直接从文件中读取。文件内容应首先以字符串形式读取。这是从同一HTML文件输出所有段落的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from lxml import html
with open('input.html') as f:
     html_string = f.read()
tree = html.fromstring(html_string)
para = tree.xpath('//p/text()')
for e in para:
     print(e)

# Output
# This HTML is XML Compliant!
# This is the second paragraph

lxml网页抓取教程

现在我们知道如何解析和查找XML和HTML中的元素,唯一缺少的部分是获取网页的HTML。

为此,“requests”库是一个不错的选择。它可以使用pip包管理器安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install requests

一旦安装了requests库,就可以使用简单的get()方法检索任何网页的HTML。示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests

response = requests.get('http://books.toscrape.com/')
print(response.text)
# prints source HTML

可以与lxml结合以检索所需的任何数据。

这是一个输出维基百科国家列表的简单示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
from lxml import html

response = requests.get('https://en.wikipedia.org/wiki/List_of_countries_by_population_in_2010')

tree = html.fromstring(response.text)
countries = tree.xpath('//span[@class="flagicon"]')
for country in countries:
    print(country.xpath('./following-sibling::a/text()')[0])

在这段代码中,response.text返回的HTML被解析为变量树。可以使用标准XPath语法进行查询,连接XPath。请注意,xpath()方法返回一个列表,因此在此代码片段中仅获取第一项。

这可以很容易地扩展为从HTML读取任何属性。例如,以下修改后的代码输出结果为国旗的国家名称和图像URL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for country in countries:
    flag = country.xpath('./img/@src')[0]
    country = country.xpath('./following-sibling::a/text()')[0]
    print(country, flag)

结论

在这个Python lxml教程中,介绍了使用lxml库处理XML和HTML。Python lxml库是一个轻量级、快速且功能丰富的库。可用于创建XML文档、读取现有文档和查找特定元素。这个库对于XML和HTML文档同样强大。结合Requests库,它也可以很容易地用于网页抓取。

您可以阅读使用Selenium或其他有用库(例如Beautiful Soup)的文章并了解有关网络抓取的更多信息。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Python爬虫实战】高效解析和操作XML/HTML的实用指南
在 Python 生态系统中,lxml 是一个功能强大且广泛使用的库,用于高效地解析和操作 XML 和 HTML 文档。无论你是处理简单的 HTML 页面还是复杂的 XML 数据结构,lxml 都提供了强大的工具集,包括 XPath、XSLT 转换以及 CSS 选择器支持等。这篇文章从 lxml 的基础安装开始,逐步深入讲解如何解析文档、提取数据、修改文档结构,并涵盖了处理大型文档和使用命名空间等进阶操作。无论你是刚开始接触 lxml 还是希望深入掌握其高级功能,这篇文章都将为你提供完整的参考。
易辰君
2024/11/07
1360
lxml简明教程
最近要做下微信爬虫,之前写个小东西都是直接用正则提取数据就算了,如果需要更稳定的提取数据,还是使用 xpath 定位元素比较可靠。周末没事,从爬虫的角度研究了一下 python xml 相关的库。
爬虫技术学习
2023/02/14
6670
lxml简明教程
生成接口测试报告
前面实现了第一种方法,就是通过写文件,然后参数化读取。 现在来讲第二种实现,直接改脚本里面数据。 首先jmeter文件存储为xml类型的。我们得熟悉python处理xml. python有几种处理xml的库,这里讲ElementTree 类似一个轻量级的DOM。 python3.3之后ElementTree模块会自动寻找可用的C库来加快速度
赵云龙龙
2020/08/25
1.1K0
生成接口测试报告
lxml基本用法_XML是什么
lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析,与Beautiful相比,效率更高。
全栈程序员站长
2022/11/15
7120
lxml基本用法_XML是什么
11月10日python爬虫分析网页的模块lxml和Beautiful Soup
format自动排列 # 定义文件存储的位置,原始的定义要改变的地方是定义在字符串中的 fileName = 'g:/spider/poetry/poetry{0}.html' f = open(fileName.format(z), "wb")
武军超
2019/02/25
9810
Python-数据解析-lxml库-上
lxml 使用 Python 语言编写的库,主要用于解析和提取 HTML 或者 XML 格式的数据。
小团子
2019/07/18
1K0
Python-数据解析-lxml库-上
python处理testlink
在软件活动中,我们需要对测试用例进行管理,如果只用excel,不用管理工具系统的管理,那么将出现以下一些问题: 案例文件分散,测试进度不透明; 需求变更导致的测试计划/测试用例变更,未能及时通知相关测试人员; 版本管理困难,很难追踪版本的变化; 缺陷管理与测试用例管理脱节,不便于缺陷密度的分析; 产品需求、测试计划、测试用例未能建立关联,不便于测试过程管理; 缺乏相关的测试分析报告数据,不便于暴露测试风险;
赵云龙龙
2019/09/03
2.1K0
python处理testlink
Python下的XML文件处理与远程调用实践
XML是一种用于存储和传输数据的标记语言,具有自我描述性和可扩展性的特点。它使用标签和属性来定义数据的结构,被广泛应用于配置文件、Web服务通信和数据交换等领域。
一键难忘
2024/03/16
2090
快速入门网络爬虫系列 Chapter08 | 使用Python库抽取
Xpath表达式可以用来检索标签内容: 获取 标签的所有class属性: //div/@class
不温卜火
2020/10/28
1.9K0
快速入门网络爬虫系列 Chapter08 | 使用Python库抽取
网络爬虫 | XPath解析
在学习xpath提取数据之前,得先了解下解析HTML代码的一些方法,如果读者想更加深入学习HTML代码等相关内容,需要去查看下前端HTML相关内容,本文仅介绍网络爬虫需要用到的部分内容。
数据STUDIO
2021/06/24
1.3K0
Python网络爬虫基础进阶到实战教程
网络爬虫是指一种程序自动获取网页信息的方式,它能够自动化地获取互联网上的数据。通过使用网络爬虫,我们可以方便地获取到网络上的各种数据,例如网页链接、文本、图片、音频、视频等等。
全栈若城
2024/02/29
2000
Python网络爬虫基础进阶到实战教程
python处理xml
XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
菲宇
2019/06/11
1.5K0
Python基础教程(二十二):XML解析
XML(eXtensible Markup Language),一种标记语言,常用于数据存储和交换。Python提供了多种库来解析和处理XML文档,如xml.etree.ElementTree、lxml和xml.dom.minidom。本文将深入讲解如何使用Python的xml.etree.ElementTree库来解析和操作XML文档,通过具体案例帮助你掌握这一技能。
用户11147438
2024/06/17
5860
Python 爬虫数据抓取(10):LXML
它是一个第三方库,专门用于操作XML文件。我们在上一节中已经对XML有了深入的了解。
数据科学工厂
2024/07/05
1230
Python 爬虫数据抓取(10):LXML
如何在ElementTree文本中嵌入标签
在 ElementTree 中,你可以使用 Element 对象的方法来创建新的标签,并将其嵌入到现有的 XML 结构中。下面是一个简单的示例,演示了如何在 ElementTree 文本中嵌入新的标签:
华科云商小徐
2024/06/12
1020
结构标记处理工具(一)、xml模块
什么是xml? xml和json的区别 xml现今的应用 xml的解析方式 xml.etree.ElementTree SAX(xml.parsers.expat) DOM 修改xml 构建xml
狼啸风云
2019/10/22
3K0
XPath语法和lxml模块
xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。
用户2200417
2022/02/18
1.2K0
Python爬虫网页,解析工具lxml.html(二)
【前情回顾】如何灵活的解析网页,提取我们想要的数据,是我们写爬虫时非常关心和需要解决的问题。
一墨编程学习
2019/05/13
1.5K0
Python爬虫网页,解析工具lxml.html(二)
Python学习--xml-Elemen
当你需要解析和处理 XML 的时候,Python 表现出了它 “batteries included” 的一面。 标准库 中大量可用的模块和工具足以应对 Python 或者是 XML 的新手。
py3study
2020/01/07
8420
三十二、python操作XML文件
''' XML:模块 xml总结 1、解析 str 文件 tree,ElementTree,type root,Element,type 2、操作 Element: tag,text,find,iter,get,set... 3、重新写入 tree.write() str没有tree--->ElementTree(root) tree.write(xx,encoding='utf-8',xxx,xxx) 4、创建xml Eleme
py3study
2020/01/08
9890
相关推荐
【Python爬虫实战】高效解析和操作XML/HTML的实用指南
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验