文章目录

  • 1.正则re
  • 2.xpath
    • 2.1 定位
      • 2.1.1 xpath中选取节点的路径表达式
      • 2.1.2 xpath谓语,即[ ]中的内容
      • 2.1.3 选取未知节点
      • 2.1.4 选择多个路径
    • 2.2 获取文本
      • 2.2.1 获取标签内的文本
      • 2.2.2 获取属性值
  • 3. BeautifulSoup
    • 3.1 定位
    • 3.2 获取文本

requests获取到网页源码之后,往往需要经过数据提取才能获得我们想要的数据,本文将介绍Python爬虫中常用的3中数据提取方式。
        正文开始之前,先说一个小tips,有时候requests.xxx.text直接获得的源码中,可能会出现中文乱码的情况,这一问题主要有两种解决方式:

  • method1:
response = requests.get() #或者post
response.encoding = 'uft-8'
page_text = response.text
  • method2:
    该方法只针对某一节点解析出来的中文发生乱码这种情况
str_refine = str_error_code.encode('iso-8859-1').decode('gbk')

正文开始

1.正则re

正则请戳这里
        Python的re模块请戳这里

2.xpath

根据HTML标签来提取所需的数据。调用语法:

from lxml import etree
# 使用本地HTML实例化一个etree对象:
tree = etree.parse('filename')
# 使用requests获得的网页源码实例化一个etree对象:
tree = etree.HTML(page_text) #page_text是requests获得的网页源码

2.1 定位

2.1.1 xpath中选取节点的路径表达式

/:绝对路径,可以看成选择子元素
        //:相对路径,可以看成选择后代元素
        .:选取当前节点
        ..:选取当前节点的父节点
        @:选取属性
        ❤️
        node.xpath('./div'):表示当前节点子元素中,所有div元素;
        node.xpath('.//div'):表示当前节点后代元素中,所有div元素;
        node.xpath('//div'):表示当前HTML页面中,所有div元素(注意是整个HTML页面哈,不论你node是在HTML的哪里)
        node.xpath('../@class'):获取当前节点的父元素的class属性值

2.1.2 xpath谓语,即[ ]中的内容

数字n:表示第n个元素,索引从1开始,node.xpath(’./a[1]’)表示当前节点的所有a子元素中的第一个;
        last():表示最后一个元素,node.xpath(’./a[last()]’)表示当前节点的所有a子元素中的最后一个;
        last()-1:倒数第二个元素;
        position()<n:表示选最前面的n-1个元素,node.xpath(’./a[position()<4]’)表示当前节点的前3个a 子元素;
        @属性名:表示含有该属性的元素,node.xpath(’./a[@href]’)表示当前节点中所有带有href属性a子元素
        @属性名="属性值":表示含有该属性、并且属性值为指定值的元素,node.xpath(’./a[@href=“www.bjyx.com”]’)表示当前节点中所有带有href属性,并且href属性值为’www.bjyx.com’的a子元素;
        contains(@属性名,"部分属性值"):当属性值不能完全匹配,只知道部分属性值时,可使用contains;node.xapth(’./a[contains(@class,“box”)]表示当前节点中所有带有class属性、并且class属性值中含有’box’的a子元素;

2.1.3 选取未知节点


        ❤️

2.1.4 选择多个路径

使用|连接:
        ❤️
        node.xpath('./a | ./b'):表示当前节点的所有a子元素和b子元素

2.2 获取文本

2.2.1 获取标签内的文本

路径内部:
        /text():获取直接文本
        //text():获取直接文本and所有后代元素中的文本
        路径外部:
        node.text:获取的是该节点的第一个子元素前的所有直接文本
        ❤️

<html>
<body><div>这是span前面的文本<span>这是span的文本</span>这是span后面的文本</div>
</body>
</html>

2.2.2 获取属性值

就是2.1.1中提到的@方法

3. BeautifulSoup

beautifulsoup只能用在Python中,其他语言无法使用。调用语法:

from bs4 import BeautifulSoup
# 实例化本地HTML文件:
f = open('./11.音视频.html','r',encoding='utf-8')
soup = BeautifulSoup(f,'lxml')
# 实例化requests获取的网页源码:
soup = BeautifulSoup(page_text,'lxml')

3.1 定位

<html lang="en">
<head><meta charset="UTF-8"/><title>11.音视频.html</title>
</head>
<body><audio src="../source/音视频/audio.mp3" controls></audio> <audio controls autoplay>对不起,您的浏览器不支持播放音频,请升级浏览器<source src="../source/音视频/audio.mp3"><source src="../source/音视频/audio.ogg"></audio>
<iframe width=500 height=500 frameborder="0" src="https://v.qq.com/txp/iframe/player.html?vid=w0031s4gikk" allowFullScreen="true"></iframe>
<p>body里直接的p标签</p>
<div>
<p class='sen1'>马上要过年啦</p>
<p class='sen2'>大家要开心呀~</p>
<p class='sen2' id=blue>wow!!!</p>
</div>
</body>
</html>

soup.标签名称:返回html中第一次出现的该标签的全部内容,返回的是一个Tag对象(就相当于一个节点node)。

soup.audio
# 返回结果:<audio controls="" src="../source/音视频/audio.mp3"></audio>

soup.find(标签名称,[属性名=属性值]) :和 soup.标签名称 一样,只返回第一个匹配的

soup.find('audio')
# 返回结果:<audio controls="" src="../source/音视频/audio.mp3"></audio>
soup.find('p',class_='sen2')
# 返回结果:<p class="sen2">大家要开心呀~</p>
# PS:属性名称应该是class,但是class是Python里面的保留关键字,所以就在后面加一个_

soup.find_all :返回符合要求的所有标签,返回的结果是一个list,list中的每个元素是一个Tag

soup.find_all('audio')
'''
返回结果:
[<audio controls="" src="../source/音视频/audio.mp3"></audio>,<audio autoplay="" controls="">对不起,您的浏览器不支持播放音频,请升级浏览器<source src="../source/音视频/audio.mp3"><source src="../source/音视频/audio.ogg"></source></source></audio>]
'''

soup.select(selector):返回的是一个list,其中selector可以是id选择器、类别选择器、标签选择器

print(soup.select('#blue'))# id选择器
print('~'*40)
print(soup.select('.sen2'))# 类别(class)选择器
print('~'*40)
print(soup.select('p'))#标签选择器
print('~'*40)
print(soup.select('body>div>p')) #层级选择器 >表示子元素
print('~'*40)
print(soup.select('body p')) #层级选择器  空格表示后代元素'''
返回结果:
[<p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p>body里直接的p标签</p>, <p class="sen1">马上要过年啦</p>, <p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p class="sen1">马上要过年啦</p>, <p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p>body里直接的p标签</p>, <p class="sen1">马上要过年啦</p>, <p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]'''

3.2 获取文本

获取标签里面的文本
        text/get_text:获得该标签的直接文本以及后代元素的文本,返回的是字符串
        string:获取该标签的直接文本,返回的是字符串
        就与xpath里面的 /text()//text()一样

soup.select('body p')[0].text #soup.select('body p')[0]就是一个节点
# 返回结果:'body里直接的p标签'

获取属性值:
        [属性名]

soup.select('div>p')[2]['id'] #获取属性id的属性值,返回值也是一个str
# 返回结果:'blue'

爬虫常用数据提取方式:正则、xpath、beautifulsoup相关推荐

  1. edge新版 能够正则式_Python爬虫七 数据提取之正则

    数据提取之正则,主要用到的re模块. 一.正则表达式 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑. 二.正则表达式的常见语法 正 ...

  2. Python爬虫常用的几种数据提取方式

    python爬虫的几种数据提取方式:正则 ,bs4,pyquery,xpath,cssselector. 一,正则 提取数据步骤:创建正则对象-->匹配查找-->提取数据保存 <ht ...

  3. 爬虫之数据提取响应内容的分类

    爬虫之数据提取响应内容的分类 在发送请求获取响应之后,可能存在多种不同类型的响应内容:而且很多时候,我们只需要响应内容中的一部分数据 结构化的响应内容 json字符串   [高频出现] 可以使用re. ...

  4. OJ平台常用数据读取方式

    OJ平台常用数据读取方式 1.C格式 读取判断: scanf函数返回值: 1.大于0时,表示正确接收的参数个数. 2.等于0时,表示输入不匹配,无法正确输入任何值. 3.等于-1时,表示EOF(end ...

  5. Python爬虫的数据提取,一篇博客就搞定啦!

    数据提取 目录 数据提取 XPath语法和lxml模块 XPath 什么是XPath XPath开发工具 XPath语法 选取节点: 谓语: 通配符 选取多个路径: 运算符: 总结 使用方式 需要注意 ...

  6. 爬虫之数据提取jsonpath模块的使用场景和使用方法

    1. jsonpath模块的使用场景 如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的.jsonpath模块就能解决这个痛点. jsonpath可以按照key对p ...

  7. 网络爬虫--13.数据提取之JSON与JsonPATH

    文章目录 一. 前言 二. JSON 三. json.loads() 四. json.dumps() 五. json.dump() 六. json.load() 七. JsonPath 八. Json ...

  8. python爬虫获取标签规则_Python爬虫之数据提取-selenium定位获取标签对象并提取数据...

    ## selenium提取数据 知识点:了解 driver对象的常用属性和方法 掌握 driver对象定位标签元素获取标签对象的方法 掌握 标签对象提取文本和属性值的方法 1. driver对象的常 ...

  9. python爬虫科研数据提取_python爬虫数据提取四之pyquery

    1 pyquery 简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便 2 pyquery基本用法 2.1 安装 pip insta ...

最新文章

  1. BZOJ1196: [HNOI2006]公路修建问题
  2. 【302天】跃迁之路——程序员高效学习方法论探索系列(实验阶段60-2017.12.04)...
  3. php composer 安装,composer安装的方法步骤(图文)
  4. 阿基米德椭圆规原理,你看懂了吗?
  5. SCU 4445 Right turn(dfs)题解
  6. ubuntu下的项目管理工具dia, planner
  7. Ubuntu18.04 上 phpvirtualbox 折腾记
  8. js字符串与数字比较大小
  9. C4 model技术架构图--context图
  10. 京东微信、手机QQ引领社交化购物趋势
  11. 如何用安装启动盘启动计算机,如何使用U盘启动进入PE安装系统,小编教你如何安装...
  12. Moto G 的开发者模式
  13. 【中秋系列】“Python中秋二维码”来了!扫一扫,会出现……
  14. android的版本电视怎么投屏,三星电视怎么投屏 三星电视投屏设置方法
  15. Mybatis中resultMap和resultType
  16. Java-绘图软件(Windows画板)
  17. Python下对信号的捕获以及优雅的处理
  18. 苹果公司的电脑发展史——硬件篇
  19. IdentityServer4总结
  20. 安拆网:钢管扣件检测标准是什么?

热门文章

  1. 阀门的开关方向_阀门的开关方向如何正确操作阀门
  2. 用计算机制作标准曲线的方法,怎么用分光光度计制作标准曲线_制作标准曲线有什么意义...
  3. video-player的应用
  4. 中文自然语言处理--基于 textCNN 的电影推荐系统
  5. 应届生毕业之后先就业还是先择业?
  6. js如何下载.apk
  7. 一加手机怎么root权限_一加 A3010手机怎样Root,如何获取Root权限?
  8. linux运行QQ,微信,企业微信 (非deepin)
  9. 计算机视觉二值分类器及判别模型,基于计算机视觉的龙井茶叶嫩芽识别方法-毕业论文.doc...
  10. 一本看到技巧又能保持阳光心态励志书(来自苏鹏的推荐)——《程序员羊皮卷》连载(4)