社区编辑申请
注册/登录
爬虫必学包 lxml,搞个有趣的
开发 后端
在这篇文章,我会使用一个精简后的html页面,演示如何通过lxml定位并提取出想要的文本。

你好,我是zhenguo,今天搞点有趣的。

这篇文章讲什么?

我们爬取网页后,无非是先定位到html标签,然后取其文本。定位标签,最常用的一个包lxml。

在这篇文章,我会使用一个精简后的html页面,演示如何通过lxml定位并提取出想要的文本,包括:

  • html是什么?
  • 什么是lxml?
  • lxml例子,包括如何定位?如何取内容?如何获取属性值?

html是什么?

html,全称HyperText Markup Language,是超文本标记结构。

html组织结构对应数据结构的树模型。

因为是树,所以只有一个根节点,即一对<html></html>标签。一对<>和名称组合称为标签,例如,<html>被称为开始标签,</html>被称为结束标签。

开始标签中可以添加附加信息,风格为属性名=属性值。

如下所示,选中的<div>就是一个开始标签,它有属性id,值为content,还有属性style等:

什么是lxml?

lxml官档截图如下,按照官档的说法,lxml是Python语言中,处理XML和HTML,功能最丰富、最易于使用的库。

不难猜想,lxml中一定实现了查询树中某个节点功能,并且应该性能极好。

lxml例子

废话不多说,举例演示lxml超简便的定位能力。

导入lxml中的etree:

from lxml import etree

my_page是html风格的字符串,内容如下所示:

my_page = '''
<html>
<title>程序员zhenguo</title>
<body>
<div>我的文章</div>
<h1>我的网站</h1>
<div id="photos">
<img src="pic1.png" />
<span id="pic1"> 从零学Python </span>
<img src="pic2.png" />
<span id="pic2">大纲</span>
<p>
<a href="http://www.zglg.work">更多详情</a>
</p>
<a href="http://www.zglg.work/python-packages/">Python包</a>
<a href="http://www.zglg.work/python-intro/">Python小白</a>
<a href="http://www.zglg.work/python-level/">Python进阶</a>
</div>
<div id="explain">
<p class="md-nav__item">本站总访问量159323次</p>
</div>
<div class="foot">Copyright © 2019 - 2021 程序员zhenguo</div>
</body>
</html>
'''

使用etree.fromstring转化为可以使用xpath的对象。

html = etree.fromstring(my_page)

定位

接下来,就能方便的定位:

  1. 定位出所有div标签,写法//div

# 定位
divs1 = html.xpath('//div')
  1. 定位出含有属性名为id的所有标签,写法为://div[@id]

divs2 = html.xpath('//div[@id]')
  1. 定位出含有属性名class等于foot的所有div标签,写法为://div[@class="foot"]

divs3 = html.xpath('//div[@class="foot"]')
  1. 定位出含有属性名的所有div标签,写法为://div[@*]

divs4 = html.xpath('//div[@*]')
  1. 定位出不含有属性名的所有div标签,写法为:not(@*)

divs5 = html.xpath('//div[not(@*)]')
  1. 定位出第一个div标签,写法为://div[1]

divs6 = html.xpath('//div[1]')
  1. 定位出最后一个div标签,写法为://div[last()]

divs7 = html.xpath('//div[last()]')
  1. 定位出前两个div标签,写法为//div[position()<3],注意从1开始:

divs8 = html.xpath('//div[position()<3]')
  1. 定位出所有div标签和h1标签,写法为://div|//h1,使用|表达:

divs9 = html.xpath('//div|//h1')

取内容

取出一对标签中的内容,使用text()方法。

如下所示,取出属性名为foot的标签div中的text:

text1 = html.xpath('//div[@class="foot"]/text()')

取属性

除了定位标签,获取标签间的内容外,也会需要提取属性对应值。

获取标签a下所有属性名为href的对应属性值,写法为://a/@href

value1 = html.xpath('//a/@href')

得到结果:

['http://www.zglg.work', 'http://www.zglg.work/python-packages/', 'http://www.zglg.work/python-intro/', 'http://www.zglg.work/python-level/']

还可以做一些特殊的定制操作,如使用findall方法,定位到div标签下带有a的标签。

使用text获取内容,a.attrib.get获取对应属性值。

divs = html.xpath('//div[position()<3]')
for div in divs:
ass = div.findall('a') # div/a
for a in ass:
if a is not None:
# print(dir(a))
print(a.text, a.attrib.get('href'))

最后注意一个区别,a_href等于第二个div标签下的子标签a的href属性值;

b_href等于第二个div标签下的子或所有后代标签下a的href属性值:

a_href = html.xpath('//div[position()=2]/a/@href')
print(a_href)
b_href = html.xpath('//div[position()=2]//a/@href')
print(b_href)
责任编辑:庞桂玉 来源: Python小例子
相关推荐

2022-04-11 11:38:44

Python代码游戏

2022-05-18 10:58:36

LinuxKali Linux

2022-05-16 10:36:08

GitHub开源项目

2022-04-01 10:08:21

SQL 优化MySQL数据库

2022-04-18 12:29:18

C++

2022-03-10 08:24:17

Docker容器SaaS

2022-05-17 15:51:32

数据中心运维能力基础设施

2022-05-07 09:08:13

路由策略网络规划

2022-05-11 14:05:11

区块链网络安全存储

2022-05-17 16:56:33

开发工具前端

2022-04-13 18:40:59

Python开发

2022-05-20 08:55:02

py文件exepython

2022-04-15 09:23:29

Kubernetes面试题

2022-04-25 14:06:28

数据分析人工智能机器学习

2022-05-13 09:15:21

三层交换机二层交换机VLAN

2022-05-06 09:21:21

TypeScriptinterfacetype

2022-05-19 15:47:24

碰一碰连接设备开发鸿蒙

2022-05-17 09:14:50

聚类算法python

2022-05-07 11:08:50

Linuxapt 命令

2022-04-15 14:57:57

Flex布局鸿蒙操作系统

同话题下的热门内容

让程序员心动的11种新编程语言突发!Gitee宣布仓库开源必须人工审核,「中国Github」要无了?风口上的低代码,技术人需要考虑哪些?中国首位游戏设计博士黄石:今日之技术即未来之艺术!所有技术都在加速发展Flutter vs ReactJS:2022年应该选哪个?用不同的测试模型来构建测试套件Linux容器技术的实现原理再有人问你什么是分库分表,直接把这篇文章发给他

编辑推荐

2017年9月编程语言排行榜:Java、C与C++三巨头还能统治排行榜多久?2017年最受欢迎的5个前端框架比较2017年11月编程语言排行榜:脚本语言怎么了?2017年3月编程语言排行榜:Swift首次进入前十最近租房有点烦!技术人如何用Python找到称心如意的“小窝”?
我收藏的内容
点赞
收藏

51CTO技术栈公众号