【爬虫】第四部分 xpath
4. xpath
4.1 准备工作
下载xpath
插件,可以在网上找有很多,下载完后将其放入浏览器中,当出现这个小黑框的时候就证明已经安装成功了!
pip install lxml
4.2 xpath基础语法
from lxml import etree
# 解析本地文件
tree = etree.parse('baodu.html')
# 解析服务器响应文件
tree = etree.HTML(response.read().decode('utf-8'))
注意:如果在运行的过程中遇到lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 6 and head, line 8, column 8
这个报错只需要在html中meta标签加 / ,形成闭合标签就行。
<meta charset="UTF-8">
<meta charset="UTF-8"/>
from lxml import etree
# 解析本地文件
tree = etree.parse('./test.html')
"""
// : 表示的是后代元素
/ : 表示的是子代元素
text() : 表示是读取标签中的内容
[@class] : 表示class属性
[@id] : 表示id属性
[@属性名] :表示该属性
[contains(属性名,'模糊匹配的字符')] :模糊匹配
[starts-with(属性名,'以什么字符开头')] :匹配开头
"""
# 查找所有的li标签,并且读取li的值
data = tree.xpath('//li/text()')
data = tree.xpath('//ul/li/text()')
# 查找带有id属性的li标签
data = tree.xpath('//ul/li[@id]/text()')
# 查找带有class属性的li标签
data = tree.xpath('//ul/li[@class]/text()')
# 查找class为qz的li标签
data = tree.xpath('//ul/li[@class="qz"]/text()')
# 查找id为city的li标签
data = tree.xpath('//ul/li[@id="city"]/text()')
# 查找class属性值中包含a的li标签
data = tree.xpath('//ul/li[contains(@class,"a")]/text()')
# 查找class属性中以a开头的li标签
data = tree.xpath('//ul/li[starts-with(@class,"a")]/text()')
# 查找带有title属性的li标签
data = tree.xpath('//ul/li[@title="shanghai"]/text()')
# 读取class属性的值
data = tree.xpath('//ul/li[@class]/@class')
print(data)
4.3 案例
获取百度一下文字
import urllib.request
from lxml import etree
url = 'https://www.xxx.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# 伪装
request = urllib.request.Request(url=url,headers=headers)
# 模拟浏览器发请求获取数据
response = urllib.request.urlopen(request).read().decode('utf-8')
# 解析获取到的数据
tree = etree.HTML(response)
# 提取出满足条件的数据
data = tree.xpath('//input[@id="su"]/@value')
print(data)
批量下载图片
import urllib.request
from lxml import etree
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Referer': 'https://sc.xxx.com/',
'Cookie': 'cz_statistics_visitor=086cd776-2a61-9683-d6d4-8a49a8f455d8; Hm_lvt_398913ed58c9e7dfe9695953fb7b6799=1666853343; ASP.NET_SessionId=pz1abstpd3llmckywg4ed24z; Hm_lpvt_398913ed58c9e7dfe9695953fb7b6799=1666853360'
}
def getPicture(headers, page):
if page == 1:
url = 'https://sc.xxx.com/tu/touxiang.html'
else:
url = f'https://sc.xxx.com/tu/touxiang-{page}-0-0.html'
# 伪装
request = urllib.request.Request(url=url, headers=headers)
# 发请求
response = urllib.request.urlopen(request).read().decode('utf-8')
# 解析服务器返回的数据
tree = etree.HTML(response)
# 筛选
src = tree.xpath('//div[@id="ulcontent"]//div[@class="new_block"]//img/@data-src')
name = tree.xpath('//div[@id="ulcontent"]//div[@class="new_block"]//img/@alt')
# 下载图片
for i in range(len(src)):
Name = name[i]
s = src[i].replace('\\', '/')
Src = f"https:{s}"
urllib.request.urlretrieve(url=Src, filename='./Image/' + Name + '.jpg')
if __name__ == '__main__':
start = int(input('请输入起始页:'))
end = int(input('请输入结束页:'))
for i in range(start, end + 1):
getPicture(headers=headers, page=i)
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!