python:xpath表达式的疑问
小白表达能力弱,辞不达意,请大神嘴下留情,我哪里说得不清楚,麻烦耐心指出来。我再想办法说清楚。下面是某视频教程的代码。
我对12行和20行中的数据解析不太懂。
#12行:host_li_list = tree.xpath('//div[@class="bottom"]/ul/li')
#20行:city_names_list = tree.xpath('//div[@class="bottom"]/ul/div/li')
在网站的网页的源码中,有两个div, class = bottom, 但是它们的父级都不一样。(见截图)
第一个div class=bottom: 是热门城市
第二个div class=bottom: 是全部成市
但是在这个爬虫虫的代码中,没有写不同的父级,直接跳到div[@class="bottom"], 程序能搞清楚,到底是要解析哪个div class=bottom的数据吗?
难道程序是先去试第一个表达式12行,如果成立,就不会往下走了;如果不成立,去试20行?
https://img-bbs.csdn.net/upload/202010/09/1602258222_109942.png
import requests
from lxml import etree
#项目需求:解析出所有城市名称https://www.aqistudy.cn/historydata/
if __name__ == "__main__":
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
url = 'https://www.aqistudy.cn/historydata/'
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
host_li_list = tree.xpath('//div[@class="bottom"]/ul/li')
all_city_names = []
#解析到了热门城市的城市名称
for li in host_li_list:
hot_city_name = li.xpath('./a/text()')
all_city_names.append(hot_city_name)
#解析的是全部城市的名称
city_names_list = tree.xpath('//div[@class="bottom"]/ul/div/li')
for li in city_names_list:
city_name = li.xpath('./a/text()')
all_city_names.append(city_name)
print(all_city_names,len(all_city_names)) 不是这么理解的吧,
我猜,应该是,和windows的文件路径一样,
把整个xpath('//div[@class="bottom"]/ul/li')当成一个路径来看,能找到,就返回了,找不到,就报错了
至于class相同也不影响啊,整体的路径不一样,找到数据就行了
不知道这样理解对不对 其实这个么有影响,除非子节点是一样的,它是获取全部class为bottom的div,然后再继续往下找,如果两个div都有同一个子节点ul,则都返回,如果没有,则返回其中一个,所以不影响 xpath会把所有符合规则的路径都找到,比如第12行,'//div[@class="bottom"]/ul/li',会把所有符合这个路径的标签及标签下文字都找到,放在列表里,所以写xpath时,不用去管程序搞不搞得清楚父级是什么,只需要把xpath路径写得唯一就行,这样,楼主就就能理解了吧?在看第20行,能满足这个路径的,只有页面源代码里的
全部城市那里,所以,楼主的关注点要改一下,就好理解了!望采纳!!! 谢谢你们三位大神的热心帮助。
你们说的在我看来都是一个意思,所以我选择第一个回复我的大神当最佳。其他两位,小白再次表示非常感谢。
页:
[1]