python3.8.3如何安装lxml才可使用etree_Spider-Learning—lxml提取—爬取2019中国大学排名...

三、lxml提取

3.1 2019中国大学排名

3.1.1目标

目标地址:

2019中国最好大学排名_最好大学网​www.zuihaodaxue.com

爬取中国大学2019的排名信息,爬取‘排名’,‘学校名’,‘省份’,‘总分’,这四个字段信息

3.1.2 环境配置

打开 cmd 命令行(win + r)

输入 pip install lxml 完成lxml库的安装。

5d46cc338286b7595be3529a2a07fba1.png

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

我们看到此处代码的参数比之前多了.encoding,即

 response.encoding = 'utf-8'

这个的意思是说,把响应的结果的 html 源码的编码格式设置成 utf-8,不这样做的话,我们提取到的数据中如果有中文的,那显示就会是乱码

3.1.4 分析数据

检查查看元素如下图所示:

ce35e4f7cec4dcc2f7e997abe5fa67fe.png

我们可以发现我们所需要的数据在<tr class=’alt’>...</tr>标签中,每一条‘排名’‘学校名’‘省份’‘总分’都对应一个 <tr class="alt">...</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 返回的是列表,所以我们接下来遍历返回的列表,循环每一个标签从中提取出每个数据,观察每一条标签下的子节点,如下图:

64f4f2a4cf65ec3c67be24ebc7ad884d.png

有很多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 爬取结果

import requests
import time
from lxml import etree
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
def get_infos(html):
    '''
    提取数据
    '''
    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)
def main():
    '''
    主接口
    '''
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
    html = get_html(url)
    get_infos(html)
    time.sleep(1)
if __name__ == '__main__':
    main()

运行效果如下:

80d34f9d2814cc30927b0836370577ec.png

欢迎大家加入人工智能圈参与交流

人工智能学习圈 - 知乎​www.zhihu.com
dac57dffbc50721e2cfb20b4685219bf.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值