Python数据提取-lxml模块
作者:钢铁男儿? 发布时间:2022-04-03 15:15:19
知识点:
了解lxml模块和
xpath
语法的关系;了解lxml模块的使用场景;
了解lxml模块的安装;
了解 谷歌浏览器
xpath helper
插件的安装和使用;掌握xpath语法-基础节点选择语法;
掌握 xpath语法 -节点修饰语法;
掌握xpath语法 - 其他常用语法;
掌握 lmxl模块中使用xpath语法定位元素提取数学值或文本内容;
掌握lxml模块etree.tostring函数的使用;
1、了解lxml模块和xpath语法
对html
或xml形式的文本提取特定的内容,就需要我们掌握lxml模块的使用和xpath语法。
lxml模块可以利用xPath规则语法,来快速的定位HEML \ XML 文档 * 定元素以及获取节点信息(文本内容、属性值);XPath
(XML Path Language)是一门HTML\XML 文档中查找信息的语言,可用来在HTML|XML文档中对元素和属性进行遍历。
提取xml、html的数据需要lxml模块和xpath语法配合使用;
2、谷歌浏览器xpath helper插件的安装和使用
在谷歌浏览器中对当前页面测试xpath语法规则。
谷歌浏览器xpath helper插件的安装和使用
我们以windows
为例进行xpath helper的安装。
xpath helper
插件的安装:
1)、下载Chrome插件 XPath Helper
可以在Chrome应用商城进行下载,如果无法下载,也可以从下面的链接进行下载
2)、把文件的后缀名crx改为rar,然后解压到同名文件夹中;
3)、把解压后的文件夹拖入到已经开启开发者模式的chrome浏览器扩展程序界面;
3、xpath 的节点关系
学习xpath语法需要先了解xpath中的节点关系。
3.1 xpath中的节点什么
每个html
、xml的标签我们都称之为节点,其中最顶层的节点称为根节点。我们以xml
为例、html也是一样的。、
3.2 xpath中节点的关系
author
是 title
的第一个兄弟节点。
4、xpath语法 - 选取节点以及提取属性或文本内容的语法
1)、XPath 使用路径表达式来选取XML文档中的节点或者节点集。
2)、这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似;
3)、使用chrome插件选择标签时候,选中的标签会添加属性class=“xh-highlight”;
4.1 xpath定位节点以及提取属性或文本内容的语法
5、xpath 语法 - 选取特定节点的语法
可以根据标签的属性值,下标等来获取特定的节点。
5.1 选取特定节点的语法
5.2 关于xpath的下标
在xpath中,第一个元素的位置是1;
最后一个元素的位置是last();
倒数第二个是last() - 1;
6、xpath语法 - 选取未知节点的语法
可以同通配符来选取未知的html
、xml
的元素。
6.1、选取未知节点的语法
7.lxml模块的安装与使用示例
lxml模块是一个第三方模块,安装之后使用。
7.1 lxml模块的安装
对发送请求获取的xml或html形式的响应内容进行提取。
pip install lxml
7.2 爬虫对html提取的内容
提取标签中的文本内容;
提取标签中的属性的值;
比如,提取a标签中href属性的值,获取url,进而继续发起请求。
7.3 lxml模块的使用
1)、导入lxml的etree库
from lxml import etree
2)、利用etree.HTML
,将html字符串(bytes类型或str类型)转化为Element
对象,Element
对象具有xpath的方法,返回结果的类别。
html = etree.HTML(text)
ret_list = html.xpath("xpath语法规则字符串")
3)、xpath方法返回列表的三种情况
返回空列表:根据xpath语法规则字符串,没有定位到任何元素;
返回由字符串构成的列表:xpath字符串规则匹配的一定是文本内容或某属性的值;
返回由Element
对象构成的列表:xpath规则字符串匹配的是标签,列表中的Element
对象可以继续进行xpath;
import requests
from lxml import etree
class Tieba(object):
def __init__(self,name):
self.url = "https://tieba.baidu.com/f?ie=utf-8&kw={}".format(name)
self.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
def get_data(self,url):
response = requests.get(url,headers=self.headers)
with open("temp.html","wb") as f:
f.write(response.content)
return response.content
def parse_data(self,data):
# 创建element对象
data = data.decode().replace("<!--","").replace("-->","")
html =etree.HTML(data)
el_list = html.xpath('//li[@class="j_thread_list clearfix"]/div/div[2]/div[1]/div[1]/a')
#print(len(el_list))
data_list = []
for el in el_list:
temp = {}
temp['title'] = el.xpath("./text()")[0]
temp['link'] = 'http://tieba.baidu.com' + el.xpath("./@href")[0]
data_list.append(temp)
# 获取下一页url
try:
next_url = 'https:' + html.xpath('//a[contains(text(),"下一页"]/@href')[0]
except:
next_url = None
return data_list,next_url
def save_data(self,data_list):
for data in data_list:
print(data)
def run(self):
# url
# headers
next_url = self.url
while True:
# 发送请求,获取响应
data = self.get_data(self.url)
# 从响应中提取数据(数据和翻页用的url)
data_list,next_url = self.parse_data(data)
self.save_data(data_list)
print(next_url)
# 判断是否终结
if next_url == None:
break
if __name__ == '__main__':
tieba =Tieba("传智播客")
tieba.run()
8、lxml模块中etree.tostring函数的使用
运行下边的代码,观察对比html
的原字符串和打印输出的结果
from lxml import etree
html_str = """<div<<ul>
<li class="item-1"><a href="link1.html" rel="external nofollow" >first item</a></li>
<li class="item-1"><a href="link2.html" rel="external nofollow" >second item</a></li>
<li class="item-inactive"><a href="link3.html" rel="external nofollow" >third item</a></li>
<li class="item-1"><a href="link4.html" rel="external nofollow" >fourth item</a></li>
<li class="item=0"><a href="link5.html" rel="external nofollow" >fifth item</a>
</ur></div>
"""
html = etree.HTML(html_str)
handeled_html_str = etree.tostring(html).decode()
print(handeled_html_str)
结论:
lxml.etree.HTML(html_str)
可以自动补全标签;lxml.etree.tostring
函数可以将转换位Element
对象再转换回html字符串;爬虫如果使用
lxml
来提取数据,应该以lxml.etree.tostring
的返回结果作为提取数据的依据;
来源:https://blog.csdn.net/weixin_42291376/article/details/122274080


猜你喜欢
- 阅读上一篇:FrontPage2002简明教程一:安装与界面FrontPage中对于文字与图像的处理与Word很相似,用过Word的人对于F
- 本文实例讲述了Python实现基于C/S架构的聊天室功能。分享给大家供大家参考,具体如下:一、课程介绍1.简介本次项目课是实现简单聊天室程序
- 当然有,看看下面,你就会明白:<%Sub TimeDelaySeconds(Delay
- 增加字段alter table docdsp add dspcode char(200)删除字段ALTER TABLE tabl
- 最近做项目正好需要坐标的转换各地图API坐标系统比较与转换;WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北
- 一.Memory Dumps 1).Global Area ALTER SESSION SET EVENTS ‘immediate trac
- 在JavaScript中,可以用三种方法来遍历对象的property:1.for/in。可以使用for/in语句遍历对象自身的propert
- 应用背景背景:“由于工作需要可能需要对一些文件进行重命名的处理,但是可能操作起来比较烦,点错了就命名失败或者没带鼠标,用控制板操作起来比较麻
- Python实现OCR识别:pytesseractPython常用pytesseract进行图片上的文字识别,即OCR识别,完整的代码比较简
- 一、内容简介使用while循环编写重复执行的语句使用哨兵值控制循环使用for循环实现计数器控制使用break、continue控制循环二、w
- 在讨论IE6的BUG及如何修复之前,有必要讲叙一些策略去避免这些恼人的问题——正所谓防患于未然 。IE6 市场占有率据Market Shar
- 今天在写BLOG的Trackback时,需要用到当前页的URL地址,并且包括?后的所有参数。在网上看到以下的这段ASP代码,它的
- 本文主要研究的是Django中migrate和makemigrations的差别,具体如下。在你改动了 model.py的内容之后执行下面的
- Python Json读写操作_JsonPath用法详解1. 介绍JSONPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,
- 1、一些准备工作 安装djangopip install django创建django项目进入项目代码存放目录执行命令:djang
- 你是否曾为表单设计感到过沮丧或不知所措呢?接下来三篇文章,希望能彻底改变你的看法,真正爱上Web表单设计。首先感谢Luke Wroblews
- 一,命名空间函数 tf.variable_scope tf.name_scope 先以下面的代码说明两者的区别# 命名空间管理函数'
- 导读:这篇论坛文章主要介绍了使用SQL Server升级顾问的具体步骤,详细内容请参考下文。微软提供了SQL Server 2008升级顾问
- Pytorch把Tensor转化成图像可视化在调试程序的时候经常想把tensor可视化成来看看,可以这样操作:from torchvisio
- 查询微信里的一些精选的,点击量比较大的文章。 别忘记申请apikey(登录百度账号即可获取),要完成的功能是:1、用户回复&quo