python3 xpath_「手把手教python3接口自动化」:非结构化数据提取(二)
「第十三章」 非结构化数据提取(二)
13.3 lxml 库
lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。
lxml python 官方文档:http://lxml.de/index.html
13.3.1 lxml库安装
方法一:打开cmd,输入pip install lxml
方法二:通过lxml的.whl文件来进行安装。
建议用第二种方式安装,因为后面用到的Scrapy爬虫框架需要配套安装,不然用不了。
去https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下载对应的Python版本
选择对于的版本进行下载:cp36代表的是Python版本是多少,这里我的版本是python36,操作系统是win64位的,所以我下载文件
lxml-4.2.1-cp36-cp36m-win_amd64.whl
下载下来的Python36 lxml 版本
在DOS下切换到下载的目录下(cd D:softScrapy环境搭建)
执行:pip install lxml-4.2.1-cp36-cp36m-win_amd64.whl
13.3.2 lxml库第一个案例
例子:利用lxml库etree方法来解析 HTML 代码
# 使用 lxml 的 etree 库
from lxml import etree
text = '''
- first item
- second item
- third item
- fourth item
- fifth item
'''
#利用etree.HTML,将字符串解析为HTML文档
html = etree.HTML(text)
# 按字符串序列化HTML文档
result = etree.tostring(html).decode('utf-8')
print(result)
运行结果:
- first item
- second item
- third item
- fourth item
- fifth item
lxml 可以自动修正 html 代码,例子里不仅补全了 li 标签,还添加了 body,html 标签。
13.3.3 文件读取
除了直接读取字符串,lxml还支持从文件里读取内容。我们新建一个hello.html文件:
- first item
- second item
- third item
- fourth item
- fifth item
再利用 etree.parse() 方法来读取文件。
例子:
from lxml import etree
# 读取外部文件 hello.html
html = etree.parse('./hello.html')
result = etree.tostring(html, pretty_print=True).decode('utf-8')
print(result)
运行结果:
13.4 XPath获取HTML数据实例
下面用hello.html这个文件来讲解下 XPath 如何获取html里面的相关数据。
13.4.1 获取所有的 标签
例子:
from lxml import etree
html = etree.parse('hello.html')
print(type(html)) # 显示etree.parse() 返回类型
result = html.xpath('//li')
print(result) # 打印
标签的元素集合
print(len(result))
print(type(result))
print(type(result[0]))
运行结果:
13.4.2 获取 标签的所有 class属性
例子:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/@class')
print(result)
运行结果:
['item-0', 'item-1', 'item-2', 'item-3', 'item-4']
13.4.3 获取
标签下hre 为 link1.html 的 标签
例子:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/a[@href="link1.html"]')
print(result)
运行结果:
13.4.4 获取 标签下的所有 标签
例子:
from lxml import etree
html = etree.parse('hello.html')
#result = html.xpath('//li/span')
#注意这么写是不对的:
#因为 / 是用来获取子元素的,而 并不是 的子元素,所以,要用双斜杠
result = html.xpath('//li//span')
print(result)
运行结果:
13.4.5 获取 标签下的标签里的所有 class
例子:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/a//@class')
print(result)
运行结果:
['bold']
13.4.6 获取最后一个 的 的 href
例子:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li[last()]/a/@href')
# 谓语 [last()] 可以找到最后一个元素
print(result)
运行结果:
['link5.html']
13.4.7 获取倒数第二个元素的内容
例子:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li[last()-1]/a')
# text 方法可以获取元素内容
print(result[0].text)
运行结果:
fourth item
13.4.8 获取 class 值为 bold 的标签名
例子:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//*[@class="bold"]')
# tag方法可以获取标签名
print(result[0].tag)
运行结果:
span
13.5 使用XPath 进行爬虫案例
现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地。
案例:爬取贴吧里python3的2-5页的文章
代码实现:
import os
from urllib import parse
import requests
from lxml import etree
class Spider:
def __init__(self):
self.tiebaName = input("请需要访问的贴吧:")
self.beginPage = int(input("请输入起始页:"))
self.endPage = int(input("请输入终止页:"))
self.url = 'http://tieba.baidu.com/f'
self.ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;"}
# 图片编号
self.userName = 1
def tiebaSpider(self):
for page in range(self.beginPage, self.endPage + 1):
pn = (page - 1) * 50 # page number
word = {'pn' : pn, 'kw': self.tiebaName}
word = parse.urlencode(word) #转换成url编码格式(字符串)
myUrl = self.url + "?" + word
# 示例:http://tieba.baidu.com/f? kw=%E7%BE%8E%E5%A5%B3 & pn=50
# 调用 页面处理函数 load_Page
# 并且获取页面所有帖子链接,
links = self.loadPage(myUrl) # urllib2_test3.py
# 读取页面内容
def loadPage(self, url):
req = requests.get(url, headers = self.ua_header)
#print(html.text)
html=req.text
# 解析html 为 HTML 文档
selector=etree.HTML(html)
#抓取当前页面的所有帖子的url的后半部分,也就是帖子编号
# http://tieba.baidu.com/p/4884069807里的 “p/4884069807”
links = selector.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')
# links 类型为 etreeElementString 列表
# 遍历列表,并且合并成一个帖子地址,调用 图片处理函数 loadImage
for link in links:
link = "http://tieba.baidu.com" + link
self.loadImages(link)
# 获取图片
def loadImages(self, link):
req = requests.get(link, headers = self.ua_header)
html=req.text
selector = etree.HTML(html)
# 获取这个帖子里所有图片的src路径
imagesLinks = selector.xpath('//img[@class="BDE_Image"]/@src')
# 依次取出图片路径,下载保存
for imagesLink in imagesLinks:
self.writeImages(imagesLink)
# 保存页面内容
def writeImages(self, imagesLink):
'''
将 images 里的二进制内容存入到 userNname 文件中
'''
print(imagesLink)
print("正在存储文件 %d ..." % self.userName)
# 1. 打开文件,返回一个文件对象
file = open('./images/' + str(self.userName) + '.png', 'w+',encoding="utf-8")
# 2. 获取图片里的内容
images = requests.get(imagesLink).text
# 3. 调用文件对象write() 方法,将page_html的内容写入到文件里
file.write(images)
# 4. 最后关闭文件
file.close()
# 计数器自增1
self.userName += 1
# 模拟 main 函数
if __name__ == "__main__":
# 首先创建爬虫对象
mySpider = Spider()
# 调用爬虫对象的方法,开始工作
mySpider.tiebaSpider()
运行结果:
python3 xpath_「手把手教python3接口自动化」:非结构化数据提取(二)相关推荐
- el表达式的语法_「手把手教python3接口自动化」「第三章」:Python3 语法
1 Python3 语法 1.1 基础语法 [编码] 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码. [标 ...
- 手把手教你python自动化办公(三)---PPT批量修改
手把手教你python自动化办公(三)---PPT批量修改 PPT批量修改 场景模拟:当公司让你制作10000个不同数据但背景相同的PPT时,你是干上三天,还是小手一挥,十秒搞定? 1.设计你想要的P ...
- 手把手教你使用Pandas读取结构化数据
导读:Pandas是一个基于Numpy库开发的更高级的结构化数据分析工具,提供了Series.DataFrame.Panel等数据结构,可以很方便地对序列.截面数据(二维表).面板数据进行处理. 作者 ...
- 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...
[一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...
- 【手把手教你如何从Tushare库下载股票数据,并保存在硬盘当中,第一篇数据过滤】
手把手教你如何从Tushare库下载股票数据,并保存在硬盘当中.第一篇数据过滤 前言 一.Tushare是什么? 二.代码 1.引入库 2.交易日的逻辑 3.先把每天个股的基础数据调出来 3.接下来我 ...
- 手把手教你使用Python抓取QQ音乐数据!
[一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...
- python爬取qq音乐歌曲链接为什么播放不出来_手把手教你使用Python抓取QQ音乐数据(第一弹)...
原标题:手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. ...
- python处理时间序列非平稳_手把手教你用Python处理非平稳时间序列
简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问题都有什么共同点? 它们都属于时间序列数据的范畴!如果没有"时间" ...
- 手把手教你使用Python抓取QQ音乐数据(第四弹)(文末赠书)
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 千里之行,始于足下. [一.项目目 ...
最新文章
- windows server 2008 r2虚拟机故障群集迁移
- linus下centos7防火墙设置
- 宝宝的成长脚印6/15
- JavaScript - 动态数据
- 马斯克再创历史!人类首个商业载人飞船发射成功:移民火星又近一步
- Spring 创建Bean的三种方式
- 学习GRPC(一) 简单实现
- 七言 感大兴安岭大火
- 小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置
- windows 10 安装jira进行开发管理
- 伯努利试验及n重伯努利试验
- 【实战篇】微信公众号网页授权登录实现起来如此简单
- 读书笔记:《遇见未知的自己》
- 怎么做动态文字闪图?教你一键在线做闪图
- UVa679 Dropping Balls (满二叉树+开关灯思想)
- 数字图像基本处理算法
- 【汇正财经】什么是市盈率?
- 75道程序员面试逻辑智力测试题内附详细答案
- 逐鹿工具显示服务器错误连接不上怎么解决,老司机演示win7系统安装逐鹿工具箱提示“error launching insta的图文技巧...
- Java异常分类和关系
热门文章
- 静态定义的receiver接收broadcast intent
- mysql 两张大表关联_MySQL的DropTable影响分析和最佳实践
- 名创优品向港交所提交上市申请书
- 华为nova9 SE官网上架:华为首款1亿像素手机
- 金山办公:2021年净利润10.42亿元,同比增长19%
- 宁德时代:8-12 万元区间车型终极解决方案是巧克力换电
- 灯塔预计2022年春节档票房在70亿至80亿元之间
- 疑似Redmi K40S工信部入网:主打双十一 最高支持120W快充
- 英伟达2022财年第二季度获得创纪录营收65.1亿美元
- 华为P50系列已适配鸿蒙OS 2.0 Beta2:有望4月亮相