「第十三章」 非结构化数据提取(二)

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接口自动化」:非结构化数据提取(二)相关推荐

  1. el表达式的语法_「手把手教python3接口自动化」「第三章」:Python3 语法

    1 Python3 语法 1.1 基础语法 [编码] 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码. [标 ...

  2. 手把手教你python自动化办公(三)---PPT批量修改

    手把手教你python自动化办公(三)---PPT批量修改 PPT批量修改 场景模拟:当公司让你制作10000个不同数据但背景相同的PPT时,你是干上三天,还是小手一挥,十秒搞定? 1.设计你想要的P ...

  3. 手把手教你使用Pandas读取结构化数据

    导读:Pandas是一个基于Numpy库开发的更高级的结构化数据分析工具,提供了Series.DataFrame.Panel等数据结构,可以很方便地对序列.截面数据(二维表).面板数据进行处理. 作者 ...

  4. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  5. 【手把手教你如何从Tushare库下载股票数据,并保存在硬盘当中,第一篇数据过滤】

    手把手教你如何从Tushare库下载股票数据,并保存在硬盘当中.第一篇数据过滤 前言 一.Tushare是什么? 二.代码 1.引入库 2.交易日的逻辑 3.先把每天个股的基础数据调出来 3.接下来我 ...

  6. 手把手教你使用Python抓取QQ音乐数据!

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  7. python爬取qq音乐歌曲链接为什么播放不出来_手把手教你使用Python抓取QQ音乐数据(第一弹)...

    原标题:手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. ...

  8. python处理时间序列非平稳_手把手教你用Python处理非平稳时间序列

    简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问题都有什么共同点? 它们都属于时间序列数据的范畴!如果没有"时间" ...

  9. 手把手教你使用Python抓取QQ音乐数据(第四弹)(文末赠书)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 千里之行,始于足下. [一.项目目 ...

最新文章

  1. windows server 2008 r2虚拟机故障群集迁移
  2. linus下centos7防火墙设置
  3. 宝宝的成长脚印6/15
  4. JavaScript - 动态数据
  5. 马斯克再创历史!人类首个商业载人飞船发射成功:移民火星又近一步
  6. Spring 创建Bean的三种方式
  7. 学习GRPC(一) 简单实现
  8. 七言 感大兴安岭大火
  9. 小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置
  10. windows 10 安装jira进行开发管理
  11. 伯努利试验及n重伯努利试验
  12. 【实战篇】微信公众号网页授权登录实现起来如此简单
  13. 读书笔记:《遇见未知的自己》
  14. 怎么做动态文字闪图?教你一键在线做闪图
  15. UVa679 Dropping Balls (满二叉树+开关灯思想)
  16. 数字图像基本处理算法
  17. 【汇正财经】什么是市盈率?
  18. 75道程序员面试逻辑智力测试题内附详细答案
  19. 逐鹿工具显示服务器错误连接不上怎么解决,老司机演示win7系统安装逐鹿工具箱提示“error launching insta的图文技巧...
  20. Java异常分类和关系

热门文章

  1. 静态定义的receiver接收broadcast intent
  2. mysql 两张大表关联_MySQL的DropTable影响分析和最佳实践
  3. 名创优品向港交所提交上市申请书
  4. 华为nova9 SE官网上架:华为首款1亿像素手机
  5. 金山办公:2021年净利润10.42亿元,同比增长19%
  6. 宁德时代:8-12 万元区间车型终极解决方案是巧克力换电
  7. 灯塔预计2022年春节档票房在70亿至80亿元之间
  8. 疑似Redmi K40S工信部入网:主打双十一 最高支持120W快充
  9. 英伟达2022财年第二季度获得创纪录营收65.1亿美元
  10. 华为P50系列已适配鸿蒙OS 2.0 Beta2:有望4月亮相