获取全国地级城市名称:
案例准备:导入外部库 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()
总结:
论语二则:
温故而知新,可以为师矣 --《论语》
温习旧的知识,从中获取到新的感悟,凭借这一点就可以给别人传授知识。
人不知而不愠,不亦君子乎--《论语》
别人不知晓自己,不去发火生气,不也是君子道德上的修养吗