本帖最后由 qianshang666 于 2021-2-18 00:05 编辑
一.前言
今天其实主要想介绍xpath语法,上一节我说了一下bs4解析,有不少兄弟说xpath语法更方便,其实我觉得两者各有优劣,包括正则表达式,这三者可以择优选择,最好选择自己熟悉的使用,不管是什么,能取到我们需要的数据才是好的,过几天会开个番外篇,包括tkinter和js解密部分
二.xpath语法
xpath语法常用来提取xml和html数据,通过xpath语法获取网页中我们想要的内容,其实xml和html的数据可以看成一个树形的结构,每个树有很多树枝(树枝称为节点),xpath语法提供了在树中查找不同节点的能力
[HTML] 纯文本查看 复制代码 <html>
<head>
<body>
##代码中<html>,<head>,<body>都可以看成是一个个节点,xpath语法可以快速的定位到html代码中的节点
</body>
</head>
</html>
1.// 代表从全局下,也就是从所有节点中,或者说从所有子孙元素中去查找满足条件的数据
如://div 表示从所有子孙元素中查找满足的条件
注意:xpath语法返回的是一个列表,所以到时候我们需要用循环的方式进行遍历
2.@代表选取属性
如://a/@href 表示获取所有a标签的href属性
3.点(.)代表从当前节点选取
如:.//a/@href 表示获取当前a标签的href属性
4./代表从根节点选取
如:/div 表示从根节点选取div节点
5.谓语:谓语用来查找某个特定的节点,也就是帮助我们精确的定位到某个节点
如://div[@class='hello'] 表示在全局下查找class等于hello的div节点
三.网易云热评实战
1.明确目标,我们不进行全部内容的爬取,而是指定关键字查找
2.,按下键盘上的f12,通过关键字查找,我们找到数据包,然后查看preview,发现有数据,我们就明确了我们要访问的url,也表示我们可以使用xpath语句和bs4
3.我们按一下开发者模式左上角的箭头,点击网页,找到Element定位,这样我们就找到了标题和内容的地方了
4.接下来就是按下键盘上的CTRL+F,打开搜索框,分别定位标题和内容,大家可以看看这两个语法,自己动手熟练一下
5.接下来就是说一下xpath的用法,固定的语法格式
[Python] 纯文本查看 复制代码 html=etree.HTML(text) #text这部分必须是文本,如果是html,需要加.text
ul=html.xpath("") #括号内放的就是我们写的xpath语句,需要用引号引起来
6.具体思路我已经说完了,接下来我就直接放代码了,我分别发一下bs4解析的和xpath解析的代码,其实这两段代码,只有三行不同,其他都是一模一样
(1)bs4语法代码
[Python] 纯文本查看 复制代码 import requests
from bs4 import BeautifulSoup
from lxml import etree #xpath要用到的库
import re
keyname = input('请输入你要查找的数据:')
url = 'https://www.musicbooks.cn/?s=' + keyname
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'
}
html = requests.get(url = url,headers = headers)
title_list = []
content_list = []
soup = BeautifulSoup(html.text,'lxml')
titles = soup.select('article.meta header a h2')
contents = soup.select('article.meta main p')
for title in titles:
title_list.append(title)
for content in contents:
content_list.append(content)
for title,content in zip(title_list,content_list):
print(title.text.strip())
print(content.text.strip())
print('-'*30)
(2)xpath代码
[Python] 纯文本查看 复制代码 import requests
from bs4 import BeautifulSoup
from lxml import etree #xpath要用到的库
import re
keyname = input('请输入你要查找的数据:')
url = 'https://www.musicbooks.cn/?s=' + keyname
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'
}
html = requests.get(url = url,headers = headers)
title_list = []
content_list = []
soup = etree.HTML(html.text)
titles = soup.xpath('//div/article/header/a/h2')
contents = soup.xpath('//div/article/main/p')
for title in titles:
title_list.append(title)
for content in contents:
content_list.append(content)
for title,content in zip(title_list,content_list):
print(title.text.strip())
print(content.text.strip())
print('-'*30)
7.我用tkinter做了一个简单的GUI,效果图我发出来大家看看,这个会在后续开展的番外篇详细说明的
四.序列解包
有的朋友可能已经发现上面的代码中有这样一行:for title,content in zip(title_list,content_list):
我举个例子给大家看看,大家就很容易理解了
大家就可以理解对按照顺序对列表进行遍历,并且对其进行一些数据清洗操作
后言:最后说一下,我为什么写xpath语法不直接右键单击copy——>copy xpath,这样只能找到当前那一条,还要自己再改一下,所以我建议大家还是自己写比较好,当然,对于精通xpath语法的就当我没说,哈哈,感谢大家的观看 |