掌握这三大网页解析库,基本可以解决100%网页提取问题

xpath

  • 最方便最快捷的解析方式

解析网页xpath是首选,它易读,方便书写,使用起来非常简单。使用谷歌或edge浏览器可以打开元素,直接书写xpth,所见即所得。

书写xpath语法,所选节点会在html中实时高亮显示。
xpath演示

xpath语法理解起来也很简单,“/”表示选择直接子节点,例如:/div/p,p是div下的直接子节点;“//”表示选择非直接子节点,例如:/div//p,p和div之间还有其它节点。

使用“/”选择可以联想到电脑里的资源管理器的资源路径,一个意思,“//”在xpath选择中最常用,“/”逐级选择,使用“//”跳选。

//div[@class=”list”]//a//p,中括号里的写法是指定该div的class属性,进一步限定选择。最后的p标签才是我们选择的对象,如果你要选择p标签的文本,那么后面还需要跟上“/text()”,完整写法://div[@class=”list”]//a//p/text()

爬取url是家常便饭,xpath获取某标签中的url也是非常容易,来看看吧!
xpath获取url

是的,只需要在最后的标签加上“/@href”即可获取href属性对应的url。

非常容易!

在这里仅作几个例子演示,xpath选择方式非常多,掌握其中常用几种,基本可以解决99%的网页。

想完整学习xpath,可以直接通过搜索引擎搜索,这样的视频教程和博客文档多如牛毛,在python语言中,使用xpath解析网页,首先安装使用lxml模块进行字符串转换成html,因为xpath只能处理html文档,在这里我将我学习lxml和xpath笔记分享出来。

xpath语法 lxml提取数据

pyquery

  • 最佳CSS选择器模块

pyquery是个非常不错的css选择器模块,熟知前端的都知道,css选择器有多方便,不亚于xpath。bs4虽然很受欢迎,很主流,但选择节点太繁琐,步骤多。pyquery真心不错,不使用xpath,pyquery是我最爱使用的网页解析库,它有多好用来演示下。

pyquery

  • 爬取豆瓣影评作者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pyquery import PyQuery as pq
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68'
}
import httpx
item_list = []
for i in range(0,100,20):
url = f'https://movie.douban.com/review/best/?start={i}'

r = httpx.get(url,headers = headers).text

# pyquery解析
doc = pq(r)
items = doc('.review-list .main-hd a.name')
for author in items.items():
item_list.append(author.text())

print(item_list)

打印结果:

  • [‘刷鞋大王’, ‘R荣十二’, ‘珍珠奶猹’, ‘朝暮雪’, ‘天下行走’, ‘保温杯喝冷水’, ‘枨不戒’, ‘難捨難分’, ‘江湖骗子’, ‘筷子兄弟-鸡腿’, ‘看电影看到死’, ‘上下楼梯靠右走’, ‘lanrachel’, ‘沉睡的小鹏’, ‘粉粿症候群’, ‘马尾鱼’, ‘阿甘正二’, ‘小良’, ‘之方’, ‘Fenster’, ‘咦,那个胖大海’, ‘错是世界不是我’, ‘胡萝卜糊了’, ‘应该没什么不同’, ‘雨梨’, ‘Gaaitung-Hok’, ‘黄黄国王’, ‘Hoesdont_tryme’, ‘啊?啊!’, ‘莎士比亚的妹妹’, ‘诸事大吉’, ‘岁月静好’, ‘大葱’, ‘沅有芷兮’, ‘倩儿的小岛’, ‘滔滔涛涛’, ‘地下游艺宫’, ‘沐如蓝’, ‘元宵灯会’, ‘正离子-雪’, ‘ROSES’, ‘Thelonious’, ‘王兆鑫-DOC’, ‘陈年老大’, ‘Kubrick’, ‘追剧练习生’, ‘奈此朱梁跋扈何’, ‘光’, ‘ououou’, ‘Yilianmengbi🍁’]

pyquery仅用了三行代码,第一行代码css选择,第二行代码遍历出所有作者名称添加到列表,简单高效!

re 正则表达式

  • 数据过滤提取万金油

你是谁?你旁边都有啥?

这就是正则表达式提取数据的主要思路。

  • 以豆瓣音乐为例
1
2
3
4
5
6
7
8
9
import re
import httpx
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.74',
'Cookie': 'bid=BrkWGYAPap4; __yadk_uid=lw6P9KtcK917gHOxQ7KFBg9ZAO6qM2Zc; _vwo_uuid_v2=D455FFECD444260935D06DABA5027F6F2|432066f1de62232e73a12fc1b7d76cd5; __gads=ID=79f66f4cd94a5914-2273543234c50089:T=1608093744:RT=1608093744:S=ALNI_MYwKkM1dNWT2eboajA5R_tpqDKMoQ; ll="118259"; viewed="2995812_1401853_1431596_6816154_3040149"; ct=y; gr_user_id=8bb1c9a9-726f-41ce-a3e1-ac45518dccfb; __utma=30149280.451464343.1608093740.1613747695.1613807914.17; __utmc=30149280; __utmz=30149280.1613807914.17.9.utmcsr=cn.bing.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmt=1; gr_session_id_22c937bbd8ebd703f2d8e9445f7dfd03=167484ac-1d68-49da-9138-6c24dc423db6; gr_cs1_167484ac-1d68-49da-9138-6c24dc423db6=user_id%3A0; __utmt_douban=1; ap_v=0,6.0; gr_session_id_22c937bbd8ebd703f2d8e9445f7dfd03_167484ac-1d68-49da-9138-6c24dc423db6=true; _pk_ref.100001.afe6=%5B%22%22%2C%22%22%2C1613807982%2C%22https%3A%2F%2Fcn.bing.com%2F%22%5D; _pk_ses.100001.afe6=*; _pk_id.100001.afe6=0cde17f985e0e19a.1608093739.8.1613808129.1608277773.; __utmb=30149280.5.10.1613807914'
}
r = httpx.get('https://music.douban.com/chart',headers = headers).text
result = re.findall('<a href="javascript:;">(.*?)</a>',r)
print(result)

输出结果:

  • [‘无名曲’, ‘PAP’, ‘酒色器迷 (寒山尺八 叁)’, ‘Ⅷ’, ‘五楼’, ‘Fade out’, ‘162-气人的小孩-4500’, ‘ARASHI’, ‘想告诉你她已经离开’, ‘致青春-Youth’, ‘近视-2021.01’, ‘《shamed》伴奏demo’, ‘风吟 Wind Singing’, ‘北沙滩’, ‘寻光’, ‘RED(五首钢琴曲以及念诗)’, ‘十一月 山间晚祷(古筝独奏 陈虹蕗 )’, ‘海战Moba_乡村_Boss’, ‘阳春(神奇秘谱)丝弦-丹泉琴-2021-01-24_20-40’, ‘rocket’]

python中的正则表达式是re模块,在爬虫中,使用最多的方法就是findall函数,顾名思义查找全部。括号里填入的第一个参数就是正则表达式,第二个参数是待匹配的文本。

‘<a href=”javascript:;”>(.*?)‘,这段正则中的圆括号里才是我们要提取的内容,而圆括号外只是参考,告诉正则,你要提取的内容它的左边是什么,右边是什么。圆括号里的“.*?”,点表示匹配任意符号,星号匹配零次或多次,问号是非贪婪模式匹配。

很多人觉得正则表达式复杂,因为正则表达式的元字符非常多。什么是元字符?“.*?”这三个就是元字符,它们分别匹配某一类型的数据。再比如,一个“+”在正则中就表示匹配一次或多次,“\d”就表示匹配数字。“\D”就表示匹配非数字……元字符太多了,这里介绍不完的。学习正则不必把正则所有元字符死记硬背,只需要掌握正则在不同编程语言中的语法使用即可,当提取某一类型的数据时,直接搜索引擎搜索好了,这样的资料太多了,很好找,使用起来就像查字典般容易。

正则搜索内容最高效,它不仅仅只针对网页,任何文本字符串类型都支持,所以说它是万金油。xpath提取网页数据是首选,如果html文档中的数据嵌入在javascript标签中,xpath就无能为力,何以解忧?唯有正则。

最后,奉上我的正则学习笔记。
python正则表达式学习笔记

以上就是我使用python爬虫最推荐的三大网页解析库,熟练掌握任何网页不在话下,轻而易举过滤数据,精确提取。