网络爬虫 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 分析数据

检查查看元素如下图所示

网络爬虫(三) lxml提取之中国大学排名

我们可以发现我们所需要的数据在<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 小结

完整代码如下:

importrequestsimporttimefromlxmlimportetreedefget_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: returndefget_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提取之中国大学排名的主要内容,如果未能解决你的问题,请参考以下文章

网络爬虫-课程大纲

爬虫网页解析之css用法及实战爬取中国校花网

爬虫 中国大学排名

Python爬虫——定向爬取“中国大学排名网”

中国大学排名定向爬虫

网络爬虫:中国大学排名定向爬虫