活动地址:CSDN21天学习挑战赛
目录
一,爬虫提取网页数据的流程
html字符串(python)——lxml库解析——HTML页面——Xpath提取——获取数据
二,lxml库
lxml库是XML和HTML的解析器,主要功能为解析其中的数据,也可利用XPath语法定位特定的元素及节点信息
1.安装
pip install lxml
2.解析HTML网页
主要使用lxml中的etree类
实例1——
from lxml import etree
text = '''
<html><body>
<div class="friend">
<div class="name">wen</div>
<div class="good character">cute</div>
<div class="height">184</div>
</div>
</body></html>
'''
# 开始初始化
html = etree.HTML(text) # 这里需要传入一个html形式的字符串
print(html)
print(type)
# 将字符串序列化为html字符串
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))
输出——
<Element html at 0x1d3a7483640>
<class 'type'>
<html><body>
<div class="friend">
<div class="name">wen</div>
<div class="good character">cute</div>
<div class="height">184</div>
</div>
</body></html>
<class 'str'>
进程已结束,退出代码0
实例2:读取并解析HTML文件——
创建html文件
from lxml import etree
# 将html文件进行读取
html = etree.parse('index.html')
# 将html内容序列化
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))
html = etree.HTML(result) # 这里需要传入一个html形式的字符串
print(html)
print(type)
输出——
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>python之lxml库</title>
</head>
<body>
<ul>
<li name="林" class="student">19-year-old</li>
<wi name="文" class="student">18-year-old</wi>
</ul>
<ul>
<li love-food="西红柿">生的</li>
<wi love-food="月饼">豆沙馅</wi>
</ul>
<pr>
<ul>
<ti class="time">2018.9.5-2021.6.9</ti>
<ti class="incident">we are good friends</ti>
</ul>
</pr>
</body>
</html>
<class 'str'>
<Element html at 0x2117a800dc0>
<class 'type'>
进程已结束,退出代码0
三,Xpath
XPath(XML Path Language)是一门在xml文档中查找信息的语言,可用来在xml文档中对元素和属性遍历
选取节点
常用路径表达式:
谓语
用于查找某个特定节点或者包含某个特定的值的节点,被嵌在方括号中。
选取未知节点
XPath通配符可以用来选取未知的XML元素
选取若干路径
通过在路径表达式中使用‘|’运算符,可选取若干路径
Chrome插件XPath Helper安装使用
插件下载地址:https://download.csdn.net/download/weixin_62599885/86401664
安装
打开chrome——点击右上角(三个点)——更多工具——扩展程序——将插件拖入
使用
·点击碎片图案,选择XPath插件,选择固定
·定位爬取内容:按住x键,选中要爬取的信息即可获取标签路径
Xpath实战
依然使用上面的index.html文件
1.获取所有的<wi>标签
from lxml import etree
html = etree.parse('index.html')
print(type(html)) # 显示etree.parse() 返回类型
result = html.xpath('//wi')
print(result) # 打印<wi>标签的元素集合
print(len(result))
print(type(result))
print(type(result[0]))
输出——
<class 'lxml.etree._ElementTree'>
[<Element wi at 0x20e534f37c0>, <Element wi at 0x20e5370fb00>]
2
<class 'list'>
<class 'lxml.etree._Element'>
进程已结束,退出代码0
2.获取<wi>标签所有class属性
from lxml import etree
html = etree.parse('index.html')
result = html.xpath('//wi/@class')
print(result)
输出——
['student']
3.获取<ul>标签下name为林的<li>标签
from lxml import etree
html = etree.parse('index.html')
result = html.xpath('//ul/li[@name="林"]')
print(result)
输出——
[<Element li at 0x2b6654df880>]
4.获取<pr> 标签下所有的 <ti> 标签
from lxml import etree
html = etree.parse('index.html')
result = html.xpath('//ul/ti')
print(result)
输出——
[<Element ti at 0x24d9c46fb00>, <Element ti at 0x24d9c46fa80>]
5.获取<ul> 标签下的 <ti> 标签里的所有 class:
from lxml import etree
html = etree.parse('index.html')
result = html.xpath('//ul/ti//@class')
print(result)
输出——
['time', 'incident']
6.获取最后一个<ul> 的 <wi> 的 <love-food>
from lxml import etree
html = etree.parse('index.html')
result = html.xpath('//ul[last()]/wi//@love-food')
print(result)
输出——
['月饼']
7.获取倒数第二个元素的内容
from lxml import etree
html = etree.parse('index.html')
result = html.xpath('//ul[last()-1]/wi')
print(result[0].text)
输出——
18-year-old
8.获取class 值为 incident 的标签名
from lxml import etree
html = etree.parse('index.html')
result = html.xpath('//*[@class="incident"]')
#tag方法可以获取标签名
print(result[0].tag)
输出——
ti