Python【xpath】实战案例【中】

获取全国地级城市名称:

案例准备:导入外部库 1.requests、2.lxml

容易遇到的问题:网站SSL认证失效

代码块:

#导入第三方库
import requests
from lxml import etree
# 网页地址
url = 'https://www.aqistudy.cn/historydata/'
#U-A伪装
headers = {
    'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36 Edg/109.0.1518.70'
}
#发起get请求 
page_text =requests.get(url=url,headers=headers,verify=False).text
#页面解析
tree = etree.HTML(page_text)
#xpath语法
ul = tree.xpath('//div[@class="bottom"]/ul//li')
#定义一个空列表准备存储数据
all_city_name = []
#遍历页面数据
for honst_li in ul:
    city_name = honst_li.xpath('./a/text()')[0]
    #将数据添加到定义的空列表中
    all_city_name.append(city_name)
#打印列表中存储的数据
print(all_city_name,len(all_city_name))
问题详解:

你通过网址打开你需要获取数据的网址时会出现以下页面

报错:

requests.exceptions.SSLError: HTTPSConnectionPool(host=‘httpbin.org’, port=443): Max retries exceeded with url: /get (Caused by SSLError(SSLError(1, ‘[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)’)))

原因问题:网站运营者近期未对网站安全认证向浏览器官方交付认证,证书认证失效

解决办法: 在发送get请求时添加verify=False,关闭ssl认证

未进行设置证书认证相关参数,默认是Ture 打开认证

page_text =requests.get(url=url,headers=headers).text

关闭ssl认证,verify=False

page_text =requests.get(url=url,headers=headers,verify=False).text

xpath 详解:

//div[@class="bottom"] 表示当前从div这个标签开始获取,而且div的属性class=“bottom”,这种方式也可以叫做标签定位

/ul / 表示下一层标签,/ul 表示下一层标签是ul

//div[@class="bottom"]/ul//li 表示当前从<div class="bottom">开始,下一层标签为<ul>,下下下一层标签是li,这个下下下的意思略过多个书写的标签直接来到了<li>标签

如果我没略过的话应该写成://div[@class="bottom"]/ul/div[2]/li

如果我略过的话应该写成://div[@class="bottom"]/ul//li 我可以省略ul标签不写。如果想要获取的数据和另一个不需要的数据是拿<ul>标签搞区分我们就应该写全,如果像我这样写的话有时就会拿到我们不需要的数据。

for 循环遍历:

为什么我要对<li>标签进行循环遍历,因为我们需要的数据在<li>标签当中,<li>标签又在<ul>标签当中,我们又有好多个<li>标签

ul = tree.xpath('//div[@class="bottom"]/ul//li')

我们通过属性定位先拿到<li>标签

再通过for循环遍历<div>[2]"第二个<div>标签,在第二个<div>中"拿到所有的<li>标签,

拿到一个<li>标签,我们通过xpath语法获取<li>标签中的<a>标签中文本数据,text()就是获取文本数据,后面加上 [0] 是因为文本数据在第一个<a>标签 也就是下标索引。

for honst_li in ul:
    city_name = honst_li.xpath('./a/text()')[0]

如何通过检查工具刨铣网页信息:

我用不同的颜色框起来标签就是属于一个完整的属性标签比如

<ul class = "xxx">

</ul>

我们通过观察完整的标签信息,来确定我们需要的数据到底在那个标签里,比如:

我们需要的数据是<a>标签中的文本数据“阿坝州”,<a>标签在<li>标签中,<li>标签在第二个<div>标签中,<div>[2]又在<ul>标签中,<ul>标签又在大的div这个标签中,而且div的属性class=“bottom”<div class="bottom">

正常xpath语法为://div[@class="bottom"]/ul/div[2]/li/a/text()

总结:

论语二则:

温故而知新,可以为师矣 --《论语》

温习旧的知识,从中获取到新的感悟,凭借这一点就可以给别人传授知识。

人不知而不愠,不亦君子乎--《论语》

别人不知晓自己,不去发火生气,不也是君子道德上的修养吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值