前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用re和xpath进行爬虫信息提取

用re和xpath进行爬虫信息提取

作者头像
luanhz
发布于 2020-03-31 09:14:10
发布于 2020-03-31 09:14:10
81000
代码可运行
举报
文章被收录于专栏:小数志小数志
运行总次数:0
代码可运行

把大象装进冰箱里需要3步,那么用python做网络爬虫呢?

用python做网络爬虫,也可以分3步:

  • 通过各种手段获取网络响应,得到网页源码,其中源码包含想要爬取的各种数据,例如requests、urllib、selenium等,具体方法根据目标网页反爬措施而异;
  • 在获得的网页源码中提取数据,常用方法包括re、Xpath、Bs4等;
  • 对提取的数据进行处理保存,例如写入文件(.csv,.txt等等)或者存储数据库等。

今天,主要是想谈一谈第2步,也就是如何进行数据的提取。

一般而言,3种提取数据的方法中,re速度最快,但设计正则表达式规则相对复杂;xpath速度其次,其设计规则一定程度上类似有些类似于从sql中查询数据,难度居中;bs4速度较慢,但理解简单实现也较为容易。

在具体的爬虫数据提取时,可能并不能仅用单一的提取方法,综合运用可能效果更好。例如,爬取到某网页的源码格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="intro">
                <dl>
                    <dt><a href="************" target="_blank"><h3>************</h3></a></dt>
                    <dd class="slt"><a href="****#" target="_blank"><img src="****" alt="************" border="0/"><br>****</a></dd>
                    <dd>  执业许可证号:************</dd>
                    <dd>  住所:************</dd>
                    <dd>  联络地址:************</dd>
                    <dd>  电话:************</dd>
                    <dd>  传真:************</dd>
                    <dd>  网站:<a href="************#" target="_blank">************</a></dd>
                    <dd>  负责人:
                        <a href="************" target="_blank">****</a>
                    </dd>
                    <dd>  组织形式:****</dd>
                    <dd>  主管机关:****</dd>
                    <dd>  批准日期:****</dd>
                    <dd>  执业状态:****</dd>
                </dl>
                <table width="100%" border="0" cellpadding="0" cellspacing="2" bgcolor="#FFFFFF">
                         <tbody><tr>
                          <td width="15%" align="right" bgcolor="#f2f2f2">********</td>
                          <td width="85%" bgcolor="#f2f2f2" class="team">
                                <a href="************" target="_blank">****</a>
                          </td>
                        </tr>
                    <tr>
                      <td width="15%" align="right" bgcolor="#f2f2f2">********</td>
                      <td width="85%" bgcolor="#f2f2f2" class="team">
                        <a href="********" target="_blank">****</a>
                        <a href="********" target="_blank">****</a>
                        <a href="********" target="_blank">****</a>
                        <a href="********" target="_blank">****</a>
                        <a href="********" target="_blank">****</a>
                      </td>
                    </tr>
               </tbody></table>
        </div>

源码中的所有文字信息即为要提取的字段数据,经分析发现源码2部分信息特点不一:

  • 在基础信息中,字段数目固定,且非常有规律,用正则提取效率最高;
  • 在人员信息1和2中,字段数目可变,不仅每个table块中信息条目可变,且人员信息1和2也可能可有可无,所以用正则表达式无法应对这种可变的情况,用xpath根据规则来提取效果可能更好。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="intro">
                <dl>
                    --基础信息:字段数目固定
                </dl>
                <table width="100%" border="0" cellpadding="0" cellspacing="2" bgcolor="#FFFFFF">
                         <tbody><tr>
                          <td width="15%" align="right" bgcolor="#f2f2f2"> </td>
                          <td width="85%" bgcolor="#f2f2f2" class="team"> 
                              --人员信息1:字段数目可变
                          </td>
                        </tr>
                    <tr>
                      <td width="15%" align="right" bgcolor="#f2f2f2">  </td>
                      <td width="85%" bgcolor="#f2f2f2" class="team">
                              --人员信息2:字段数目可变
                      </td>
                    </tr>
               </tbody></table>
</div>

基于此,

  • 针对基础信息,设计如下正则表达式可完美提取(信息不全时除外),
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pattern = r'<div class="intro">.*?alt="(.*?)" .*?执业许可证号:(.*?)</dd>.*?住所:(.*?)</dd>.*?联络地址:(.*?)</dd>.*?电话:(.*?)</dd>.*?传真:(.*?)</dd>.*?网站:<a href="(.*?)".*?负责人:.*?>(.*?)</a>.*?组织形式:(.*?)</dd>.*?主管机关:(.*?)</dd>.*?批准日期:(.*?)</dd>.*?执业状态:(.*?)</dd>'
  • 针对人员信息1和2,设计xpath解析表达式,并加入条件判断,可有效提取2部分信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lawers = element.xpath("//table/tr//a/text()")

结论:re和xpath作为爬虫信息提取的2种常用方法,各有利弊不分伯仲,可根据各自特点灵活选用,其中对于规律性比较强的,优先选用re提取数据;而当字段数目或者信息规则不确定时,则可以设计xpath提取。

另外:在将lxml.etree._Element对象转化为string对象时,还踩了一个坑,即直接tostring()后,会出现格式混乱即中文无法显示的问题,此时仅链式增加.decode()仅能解决格式混乱的问题,中文字符仍然会用&#xxxxx编码。此时,解决办法是在tostring()中明确编码类型,尔后再decode()可有效解决这一问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content = etree.tostring(content).decode('utf-8')

△ tostring()直接解码中文显示为编码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content = etree.tostring(content, encoding = "utf-8").decode('utf-8')

△ tostring()指定编码后再解码中文显示正确

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小数志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
网络爬虫 | XPath解析
在学习xpath提取数据之前,得先了解下解析HTML代码的一些方法,如果读者想更加深入学习HTML代码等相关内容,需要去查看下前端HTML相关内容,本文仅介绍网络爬虫需要用到的部分内容。
数据STUDIO
2021/06/24
1.4K0
技术学习:Python(16)|爬虫篇|lxml模块和Xpath
参考重要文档: https://lxml.de/ 项目开源地址在:https://github.com/lxml/lxml
艾特
2023/10/10
2270
技术学习:Python(16)|爬虫篇|lxml模块和Xpath
Python的Xpath介绍和语法详解
XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历
Lansonli
2021/10/09
4.2K0
Python爬虫——XPath
XPath 表达式 描述 nodename 选取此节点的所有子节点 / 从根节点选取 //xxx 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 . 选取当前节点 .. 选取当前节点的父节点 @xxx 选取属性内容 /text() 选取文本内容 starts-with(@属性名称,属性字符相同部分) 以相同字符开始 演示使用HTML内容 html = ''' <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8">
羊羽shine
2019/05/28
7270
强大的Xpath:你不能不知道的爬虫数据解析库
之前在爬虫解析数据的时候,自己几乎都是用正则表达式,Python中自带的re模块来解析数据。利用正则表达式解析数据的确很强大,但是表达式写起来很麻烦,有时候需要多次尝试;而且速度相对较慢。以后会专门写一篇关于Python正则的文章。
用户8949263
2022/04/08
1.6K0
强大的Xpath:你不能不知道的爬虫数据解析库
《数据采集与分析》综合模拟测验
1、如果要使用Requests库爬取网址为http://www.jou.edu.cn/的网页内容,请按如下要求写出主要的操作语句:
Francek Chen
2025/01/23
680
《数据采集与分析》综合模拟测验
python爬虫之xpath的基本使用
要先将源码etree html = requests.get(=url=headers).text html = etree.HTML(html) html = etree.tostring(html=).decode() html.xpath('/html/body/div/ul/li/a[@href="link2.html"]/text()') 或将html.text转换为选择器对象 import parsel html = parsel.Selector(html_str) url = html.x
SingYi
2022/07/13
3710
【Python爬虫实战】高效解析和操作XML/HTML的实用指南
在 Python 生态系统中,lxml 是一个功能强大且广泛使用的库,用于高效地解析和操作 XML 和 HTML 文档。无论你是处理简单的 HTML 页面还是复杂的 XML 数据结构,lxml 都提供了强大的工具集,包括 XPath、XSLT 转换以及 CSS 选择器支持等。这篇文章从 lxml 的基础安装开始,逐步深入讲解如何解析文档、提取数据、修改文档结构,并涵盖了处理大型文档和使用命名空间等进阶操作。无论你是刚开始接触 lxml 还是希望深入掌握其高级功能,这篇文章都将为你提供完整的参考。
易辰君
2024/11/07
4560
Xpath如何提取html标签(HTML标签和内容)
问题 (python,使用lxml Xpath) 需要提取HTML中一个div里所有内容(包括标签) <div> <table> <tr> <td class="td class">Row value 1</td> <td class="td class">Row value 2</td> </tr> <tr> <td class="td class">Row value 3</td> <td
wo.
2021/06/15
11.7K0
Python爬虫Xpath库详解
前面,我们实现了一个最基本的爬虫,但提取页面信息时使用的是正则表达式,这还是比较烦琐,而且万一有地方写错了,可能导致匹配失败,所以使用正则表达式提取页面信息多多少少还是有些不方便。
仲君Johnny
2024/02/07
3600
Python爬虫之xpath语法及案例使用
我们在写Python爬虫时,经常需要对网页提取信息,如果用传统正则表达去写会增加很多工作量,此时需要一种对数据解析的方法,也就是本章要介绍的Xpath表达式。
钢铁知识库
2022/08/20
1.2K0
Python爬虫之xpath语法及案例使用
史上最全html,搞定OF COURSE.
核心;相反的,title代触碰到图片显示的是什么 alt代表图片不能显示的时候出现的是什么
贵哥的编程之路
2020/10/30
6420
史上最全html,搞定OF COURSE.
HTML基础系列
HTML标记语言,网页制作的第一步。 什么是HTML呢?查百度 基础语法 常用标签
达达前端
2019/07/03
7840
HTML基础系列
前端学习笔记之HTML body内常用标签
body中的标签是会显示到浏览器窗口中的,body内的标签只有一个作用就是用来标记语义的,语义指的是从字面意思就可以理解被标记的内容是用来做什么的
Jetpropelledsnake21
2019/02/15
2.2K0
[Python]写给Dr.Wu的简单爬虫例子
概览 这次要爬的数据来自网站:http://www.qlaee.com/zhuanlist.jsp?flag=3&p=1&columnumber=302&codemyid=qlpreweb21 界面大
wOw
2018/09/18
8460
[Python]写给Dr.Wu的简单爬虫例子
HTML笔记
HTML:Hyper Text Markup Language(超级文本标签语言)
闲花手札
2021/08/24
2.5K0
HTML入门的简单学习
1:HTML简介     1.1:HTML(Haper Text Markup language):超文本标记语言     超文本就是指页面内可以包含图片,链接,甚至音乐,程序等非文字元素     
别先生
2017/12/29
4.3K0
HTML入门的简单学习
HTML基础入门
1、<meta name="keywords" content="关键字1,关键字2">
李才哥
2020/08/17
3.1K0
HTML基础入门
Python爬虫:现学现用xpath爬取豆瓣音乐
爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能
龙哥
2018/10/22
9780
Python爬虫:现学现用xpath爬取豆瓣音乐
html学习笔记(一)
单标签 <! Doctype html> 双标签 <html> </html> <head></head> <title></title>
Daotin
2018/08/31
8.5K0
html学习笔记(一)
相关推荐
网络爬虫 | XPath解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验