爬虫(六):XPath、lxml模块
1. XPath
1.1 什么是XPath
XPath(XML Path Language) 是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。
1.2 XPath开发工具
1.2.1 Chrome插件XPath Helper
https://jingyan.baidu.com/article/1e5468f94694ac484861b77d.html
1.2.2 Firefox插件XPath Checker
https://blog.csdn.net/menofgod/article/details/75646443
1.3 Xpath语法
这个就要看我写的selenium基础中的文章了。
https://www.cnblogs.com/liuhui0308/p/11937139.html
2. lxml模块
lxml是一个HTML/XML的解析库,主要功能是如何解析和提取HTML/XML数据。
lxml和正则是一样,也是用C语言实现的,是一款高性能的Python HTML/XML解析器,可以利用之前学习的XPath语法,来快速定位特定元素以及节点信息。
可通过 pip 安装:
pip install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
2.1 基本使用
我们可以利用它来解析HTML 代码,且在解析 HTML 代码的时候,如果 HTML 代码不规范,他会自动进行补全。
from lxml.html import etree htmlText = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
''' # 利用 etree.HTML,将字符串解析为 HTML 文档
html = etree.HTML(htmlText) # 按字符串序列化 HTML 文档
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8') print(result)
2.2 在文件中读取html代码
除了直接使用字符串进行解析,lxml 还支持从文件中读取内容。
html代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title></title> </head>
<body>
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
</body>
</html>
然后利用etree.parse()方法来读取文件。
from lxml.html import etree
html = etree.parse('./hello.html')
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8')
print(result)
结果:

我们看到居然报错了,为什么呢?
之所以使用etree.parse()方法解析 html 内容时,会报lxml.etree.XMLSyntaxError的错,是因为etree.parse()默认使用的是XML的解析器,所以当html内容不规范,比如出现某个标签缺少闭合标签时,就会报这个错误。这时,可使用etree.HTMLParser()创建一个HTML的解析器,然后作为etree.parse()方法的参数即可。
from lxml.html import etree htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser)
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8')
print(result)
2.3 在lxml中使用XPath语法
使用XPath语法,应该使用Element.xpath语法,来执行XPath的选择。
xpath函数返回的永远是一个列表。
我们先来匹配下li标签和a标签
from lxml.html import etree htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser) lis = html.xpath('//li')
for li in lis:
print(etree.tostring(li, encoding='utf-8', pretty_print=True).decode('utf-8'), end='') aList = html.xpath('//a/@href')
for a in aList:
print(a)

获得li标签下a标签的href属性和内容:
from lxml.html import etree htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser) lis = html.xpath('//li')
for li in lis:
# . 号表示在当前的 li 元素下去匹配
href = li.xpath('.//a/@href')[0] #获取 a 标签的 href 属性
txt = li.xpath('.//a/text()')[0] #获取 a 标签的文本
print(href, txt)

爬虫(六):XPath、lxml模块的更多相关文章
- 洗礼灵魂,修炼python(71)--爬虫篇—【转载】xpath/lxml模块,爬虫精髓讲解
Xpath,lxml模块用法 转载的原因和前面的一样,我写的没别人写的好,所以我也不浪费时间了,直接转载这位崔庆才大佬的 原帖链接:传送门 以下为转载内容: --------------------- ...
- Python爬虫基础——XPath语法的学习与lxml模块的使用
XPath与正则都是用于数据的提取,二者的区别是: 正则:功能相对强大,写起来相对复杂: XPath:语法简单,可以满足绝大部分的需求: 所以,如果你可以根据自己的需要进行选择. 一.首先,我们需要为 ...
- Python爬虫 XPath语法和lxml模块
XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...
- lxml模块(应用xpath技术)
一.lxml介绍 第三方库lxml是第一款表现出高性能特征的python xml库,天生支持Xpath1.0.XSLT1.0.定制元素类,甚至python风格的数据绑定接口.lxml是通过Cpytho ...
- python爬虫网页解析之lxml模块
08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...
- XPath语法和lxml模块
XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...
- 爬虫学习笔记(六)PyQuery模块
PyQuery模块也是一个解析html的一个模块,它和Beautiful Soup用起来差不多,它是jquery实现的,和jquery语法差不多,会用jquery的人用起来就比较方便了. Pyquer ...
- python3爬虫lxml模块的安装
1:在下载lxml之前,要先查看python的版本信息, 在CMD命令行输入python 再输入import pip; print(pip.pep425tags.get_supported()) -- ...
- 【爬虫入门手记03】爬虫解析利器beautifulSoup模块的基本应用
[爬虫入门手记03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.Bea ...
随机推荐
- String字符串为什么不可变的深入理解
String是被final修饰的,是不可变对象,那么这句什么意思呢.在学习scala时候var,val时候,就想到这个问题,所以记录下 看案例: package com.cxy; import sun ...
- .NET Core 3.0之深入源码理解HealthCheck(一)
写在前面 我们的系统可能因为正在部署.服务异常终止或者其他问题导致系统处于非健康状态,这个时候我们需要知道系统的健康状况,而健康检查可以帮助我们快速确定系统是否处于正常状态.一般情况下,我们会提供公开 ...
- VS Code实现markdown画流程图
安装最新的vscode编辑器,原生支持markdown语法.不会markdow的人可以去好好学下,写文档神器!!! 1.安装Markdown Preview Enhanced插件 2.本地新建test ...
- java JDK安装包的获取与安装
Java JDK 安装包获取和安装: JDK 1.8.211 官网下载地址 https://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...
- AWS re:Invent 2019 召开 | 云原生生态周报 Vol. 30
作者 | 何淋波.宋净超.徐迪 业界要闻 1. AWS re:Invent 2019 AWS 年度云计算盛会于 12.2-12.6 在拉斯维加斯举行. 技术分享超过 2500 场,技术方向涵盖数据分析 ...
- 英语口语考试资料College life
College life Early in senior high school, we longed to be enrolled in a university. Now the dream ha ...
- 在可插拔settings的基础上加入类似中间件的设计
在可插拔settings的基础上加入类似中间件的设计 settings可插拔设计可以看之前的文章 https://www.cnblogs.com/zx125/p/11735505.html 设计思路 ...
- desc和show
desc只能查看表结构 查看zx1表结构 desc zx1; mysql> desc zx1 -> ; +---------+---------+------+-----+-------- ...
- 分布式主键解决方案之--Snowflake雪花算法
0--前言 对于分布式系统环境,主键ID的设计很关键,什么自增intID那些是绝对不用的,比较早的时候,大部分系统都用UUID/GUID来作为主键,优点是方便又能解决问题,缺点是插入时因为UUID/G ...
- shell脚本exercise2
通过文件里面的网址,判断是否访问成功网址 #!/bin/bash check(){ code=`curl -I -m -o /dev/null -s -w %{http_code} http://$u ...