网络爬虫 lxml提取之中国大学排名
Posted 不会排版的hyhoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络爬虫 lxml提取之中国大学排名相关的知识,希望对你有一定的参考价值。
三、lxml提取
3.1 2019中国大学排名
3.1.1目标
爬取中国大学2019的排名信息,爬取‘排名’,‘学校名’,‘省份’,‘总分’,这四个字段信息
我们代码与 ‘bs4 提取’ 章节,类似,只有部分需要修改
3.1.2 环境配置
打开 cmd 命令行(win + r)
输入
pip install lxml
完成lxml库的安装。
3.1.3 请求网页
def get_html(url):
'''
获得 HTML
'''
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53\
7.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
response.encoding = 'utf-8'
return response.text
else:
return
我们看到比上一章代码,多了一个
response.encoding = 'utf-8'
这个的意思是说,把响应的结果的 html 源码的编码格式设置成 utf-8,不这样做的话,我们提取到的数据中如果有中文的,那显示就会是乱码
3.1.4 分析数据
检查查看元素如下图所示:
我们可以发现我们所需要的数据在<tr class=’alt’>...</tr>标签中,每一条‘排名’‘学校名’‘省份’‘总分’都对应一个 <tr>...</tr> 标签,其中有多少个大学就有多少个这样的标签,而每一所大学所对应的数据也在其标签中,即对应的<td>..</td>标签,所以我们分析好我们的数据以后就进行下一步的提取。
3.1.5 提取数据
html = etree.HTML(html)
# 提取所有的大学标签信息
ls = html.xpath('//tr[@class="alt"]')
for info in ls:
# 排名
rank = info.xpath('./td[1]/text()')[0]
# 学校名
name = info.xpath('./td[2]/div/text()')[0]
# 省份
province = info.xpath('./td[3]/text()')[0]
# 总分
score = info.xpath('./td[4]/text()')[0]
data = {
'排名' : rank,
'校名' : name,
'省份' : province,
'总分' : score,
}
print(data)
我们看到这里的解析有变成了
html = etree.HTML(html)
这是使用 lxml 解析 html 的写法
提取所有的学校信息的标签,就是上面说的 549 条标签,使用 xpath 方法选择标签在 html 源码里的路径,// 是选择此 html 源码里所有 tr 标签并且 class 属性为 alt 的标签。
ls = html.xpath('//tr[@class="alt"]')
提权取完 549 条标签后,xpath 返回的是列表,所以我们接下来遍历返回的列表,循环每一个标签从中提取出每个数据,观察每一条标签下的子节点,如下图:
有很多td标签,而其中的每一个数据也就是td[0 to last],我们则根据所需要的内容来写我们的xpath即可。
语法如下:
‘.’ 代表当前节点,就是对应的每次循环的这个标签的节点
‘/’ 依次选择路径
text() 获得标签中的文本信息,就是我们的实际数据
由于 xpath 返回列表,所以我们需要取第一个结果 [0]
排名、学校名、省份、总分的写法如下:
# 排名
rank = info.xpath('./td[1]/text()')[0]
# 学校名
name = info.xpath('./td[2]/div/text()')[0]
# 省份
province = info.xpath('./td[3]/text()')[0]
# 总分
score = info.xpath('./td[4]/text()')[0]
3.1.6 小结
完整代码如下:
importrequests
importtime
fromlxmlimportetree
defget_html(url):
'''
获得 HTML
'''
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53\
7.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
response = requests.get(url,headers=headers)
ifresponse.status_code ==200:
response.encoding ='utf-8'
returnresponse.text
else:
return
defget_infos(html):
'''
提取数据
'''
html = etree.HTML(html)
# 提取所有的大学标签信息
ls = html.xpath('//tr[@class="alt"]')
forinfoinls:
# 排名
rank = info.xpath('./td[1]/text()')[0]
# 学校名
name = info.xpath('./td[2]/div/text()')[0]
# 省份
province = info.xpath('./td[3]/text()')[0]
# 总分
score = info.xpath('./td[4]/text()')[0]
data = {
'排名': rank,
'校名': name,
'省份': province,
'总分': score,
}
print(data)
defmain():
'''
主接口
'''
url ='http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
html = get_html(url)
get_infos(html)
time.sleep(1)
if__name__ =='__main__':
main()
运行效果如下:
以上是关于网络爬虫 lxml提取之中国大学排名的主要内容,如果未能解决你的问题,请参考以下文章