冰冻三尺,非一日之寒。数据解析——xpath(4)

爬取全国的城市名称以及“或”的简单介绍

首先是爬取全国城市名称

网址如下:https://www.aqistudy.cn/historydata/

我们打开网页进行简单的数据分析

冰冻三尺,非一日之寒。数据解析——xpath(4)
我们发现我们需要爬取的名称都在 li 标签里。根据这个我们可以很简单地写我们的代码

import requests
from lxml import etree

if __name__ == "__main__":
    # UA伪装
    header = {
        "user-agnet": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定url
    url = "https://www.aqistudy.cn/historydata/"

    # 获取源码
    response = requests.get(url = url, headers = header).text

    # xpath 解析。热门城市名称爬取
    tree = etree.HTML(response)
    hot_city_name_li_list = tree.xpath('//div[@class="hot"]//li') # 热门城市名称的 li 标签的列表
    hot_city_name = []
    for li in hot_city_name_li_list:
        hot_city_name.append(li.xpath('a/text()')[0])
    print(hot_city_name, len(hot_city_name))
    print()

    # xpath 解析。全部城市名称爬取
    all_city_li_list = tree.xpath('//div[@class="all"]//li') # 全部城市名称的 li 标签的列表
    all_city_name = []
    for li in all_city_li_list:
        all_city_name.append(li.xpath('a/text()')[0])
    print(all_city_name, len(all_city_name))
    print()

看一下我们的运行结果

冰冻三尺,非一日之寒。数据解析——xpath(4)

我们这里爬取的名称是所有城市里包括热门城市的,要是不包括,我们要获取这些城市的名称,难道要把两个列表直接加起来吗?虽然不是不行,但实际上还是多写了几行代码的。

所以在这里介绍一下 xpath 里面的 “或”(“|”)和 “or” 的作用一样

闲话少说,直接看代码

import requests
from lxml import etree

if __name__ == "__main__":
    # UA伪装
    header = {
        "user-agnet": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定url
    url = "https://www.aqistudy.cn/historydata/"
	
	# 获取源码
    response = requests.get(url = url, headers = header).text

	# xpath 解析。“|”的使用
    tree = etree.HTML(response)
    city_name = tree.xpath('//div[@class="hot"]//li/a/text() | //div[@class="all"]//li/a/text()')
    print(city_name, len(city_name))

运行一下

冰冻三尺,非一日之寒。数据解析——xpath(4)

名称个数正好是 394 = 384 + 10

xpath 的 “或” 你学会了吗?

上一篇:[POI2014]HOT-Hotels 加强版


下一篇:「Elasticsearch」- "Hot-Warm" Architecture @20210411