12.Python爬虫利器三之Xpath语法与lxml库的用法
2024-10-18 18:18:07
LXML解析库使用的是Xpath语法:
XPath 是一门语言
XPath可以在XML文档中查找信息
XPath支持HTML
XPath通过元素和属性进行导航
XPath可以用来提取信息
XPath比正则表达式厉害
XPath比正则表达式简单
lxml使用方法:
from lxml import etree
text = '''
<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>
</ul>
</div>
''' html = etree.HTML(text) #使用etree.HTML初始化
result = etree.tostring(html) #将初始化的HTML转化成string
print result
首先我们使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。
其中,这里体现了 lxml 的一个非常实用的功能就是自动修正 html 代码,大家应该注意到了,最后一个 li 标签,其实我把尾标签删掉了,是不闭合的。不过,lxml 因为继承了 libxml2 的特性,具有自动修正 HTML 代码的功能。
所以输出结果是这样的
<html><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>
#不仅补全了 li 标签,还添加了 body,html 标签。
如何使用XPATH:
安装lxml库
from lxml import etree
Selector = etree.HTML(网页源代码)
Selector.xpath(一段神奇的符号)
XPath与HTML结构
获取网页元素的Xpath
应用XPath提取内容
案例1:
html = '''<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>测试-常规用法</title>
</head>
<body>
<div id="content">
<ul id="useful">
<li>这是第一条信息</li>
<li>这是第二条信息</li>
<li>这是第三条信息</li>
</ul>
<ul id="useless">
<li>不需要的信息1</li>
<li>不需要的信息2</li>
<li>不需要的信息3</li>
</ul>
<div id="url">
<a href="http://jikexueyuan.com">极客学院</a>
<a href="http://jikexueyuan.com/course/" title="极客学院课程库">点我打开课程库</a>
</div>
</div>
</body>
</html>
'''
selector = etree.HTML(html)
#提取文本 提取文本内容:/text()
content= selector.xpath('//ul[@id="useless"]/li/text()') #提取id属性为useless下面li标签的文本信息
content1 = selector.xpath('//ul/li/text()') #提取所有li标签的文本信息
content2 = selector.xpath('//div[@id="content"]/ul[@id="useful"]/li/text()') #提取id属性为useful下面li标签的文本信息
for each in content2:
print each #提取属性
link = selector.xpath('//a/@href') #提取属性内容: /@xxxx
for each in link:
print each
title = selector.xpath('//a/@title') #提取属性内容: /@xxxx
print title[0]
xpath基本语法
//定位根节点
/往下层寻找
提取文本内容:/text()
提取属性内容: /@xxxx
===================
xpath的特殊用法
1.以相同的字符开头
2.标签套标签
案例1
html1 = '''
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>测试-特殊用法</title>
</head>
<body>
<div id="test-1">需要的内容1</div>
<div id="test-2">需要的内容2</div>
<div id="testfault">需要的内容3</div>
</body>
</html>
''' selector = etree.HTML(html1)
content = selector.xpath('//div[starts-with(@id,"test")]/text()')
for each in content:
print each
案例2:
html2 = '''
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="test3">
我左青龙,
<span id="tiger">
右白虎,
<ul>上朱雀,
<li>下玄武。</li>
</ul>老牛在当中,
</span>龙头在胸口。
</div>
</body>
</html>
'''
selector1=etree.HTML(html2)
content1 = selector1.xpath('//div[@id="test3"]/text()')
for each in content1:
print each data = selector1.xpath('//div[@id="test3"]')[0]
info = data.xpath('string(.)')
print info
最新文章
- linux安装Mac的默认Monaco字体
- python 内建函数setattr() getattr()
- Struts2常用标签
- a few changes of Android 5.0
- List, Set, Map是否继承自Collection接口?
- RegEx正则表达式学习笔记
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
- 【原创】海量数据处理问题(一) ---- 外排,堆排,K查找的应用
- Java使用poi对Execl简单操作_总结
- 对 Xcode 菜单选项的详细探索(转)
- js 联系电话验证实现
- [Python Study Notes]匿名函数
- Django网站制作根目录,巧用404,可访问根目录任意网页
- yii 1.x 添加 rules 验证url数组
- jackson 流式API
- grep 匹配打印的上下几行
- 洛谷 P4151 [WC2011]最大XOR和路径 解题报告
- js 获取验证码计时器
- shiro工作过程
- Angular7 Drag and Drop
热门文章
- Watering Grass UVA - 10382
- vux, vue上拉加载更多
- php正则的使用
- MySQL使用的常见问题
- js将url转换二维码
- hbase安装部署
- 成功解决You are using pip version 9.0.1, however version 9.0.3 is available. You should consider upgra
- 485. Max Consecutive Ones最大连续1的个数
- Mybatis中,当插入数据后,返回最新主键id的几种方法,及具体用法
- 【转】MVC中code first方式开发,数据库的生成与更新(Ef6)