【编号0004】爬虫中常用到的数据提取手段
使用爬虫抓取网上公开的网页数据时,经常需要使用各种技能去解析到手的响应。
本篇文章,重点介绍下,数据提取时,有哪些常见的方法
0. 背景交代
-
编程语言:Python
-
提取方式:Python库
1. Xpath提取HTML内容
网页的数据,几乎都是HTML格式的,当然少不了Xpath的解析了,这是解析HTML的主要方法
安装:pip install lxml
调用:
from lxml import etree
info = etree.HTML("这里放HTML字符串")
result = info.xpath("这里放xpath规则")
语法介绍:
-
. 代表当前节点,通常用于逐块提取数据
-
.. 代表父级【上一级】标签
-
/ 子级内容
-
// 子孙级内容
-
[]
中括号中间用于放特定条件,示例div[@class="demo"]
class为demo的div标签 -
and
&or
¬()
与或非的三个条件 -
normalize-space(这里放xpath规则)
去除不可见字符并提取第一个元素的函数
更多教程链接:xpath教程【spbeen】 爬虫之数据解析的三种方式【cnblogs】
2. 正则表达式
如果数据时在js中,xpath是无法解析到js代码中的数据的,则此时,推荐正则表达式,提取出需要的数据
调用:import re
re是python的内置库
示例:
patternstr = "base64,(.*?)'"
result = re.search(pattern, html)
语法介绍:
元字符 | 匹配内容 | |
---|---|---|
. | 匹配除换行符以外的任意字符 | |
\w | 匹配字母或数字或下划线 | |
\s | 匹配任意的空白符 | |
\d | 匹配数字 | |
\n | 匹配一个换行符 | |
\t | 匹配一个制表符 | |
\b | 匹配一个单词的结尾 | |
^ | 匹配字符串的开始 | |
$ | 匹配字符串的结尾 | |
\W | 匹配非字母或数字或下划线 | |
\D | 匹配非数字 | |
\S | 匹配非空白符 | |
a | b | 匹配字符a或字符b |
() | 匹配括号内的表达式,也表示一个组 | |
[...] | 匹配字符组中的字符 | |
[^...] | 匹配除了字符组中字符的所有字符 |
更多教程连接:python re模块
3. JSON转换
在网页的异步数据中,通常会碰到 Json 格式的字符串,这一点是比较简单的。
调用:import json
json是python的内置库
示例:
import json
dict_obj = json.loads("这里放json格式的字符串")
# json.loads() 返回的结果是Python的字典,所以操作方便
语法介绍:无【字典操作太简单了,不做介绍】
但是,异步加载虽然是 json 居多,但是jsonp也是有的
何为 jsonp ?这个由来就能聊很久了
简单来说,浏览器有防跨域请求的,这是为了安全着想;但是这一棒子打死了全部的跨域请求,我要是正常请求怎么办?
答:用jsonp就可以
jsonp的数据格式,和json很像,就是在json的基础之上,套上一个函数的壳,例如:
json_str = '{"method":"get"}'
jsonp_str = '''functionName({"method":"get"});'''
jsonp的字符串,就是json的字符串套了个javascript的函数。
原来如此,不难,那怎么解析呢?
答:使用正则,取出函数内json字符串,再用json转换就可以了
示例:
import json, re
pattern_str = "{.*?}"
result = re.search(pattern_str, “jsonp字符串”)
dict_obj = json.loads(result[0])
效果图如下:

以上就是本篇文章的全部介绍内容了
!放在最后
如果文章中有什么错误或者建议修改的地方,欢迎留言纠正和回复
如果你喜欢本篇文章,不妨关注一下我们的公众号,每周更新两篇原创技术文档,都是干货
