鱼C论坛

 找回密码
 立即注册
查看: 1741|回复: 4

[已解决]python:xpath表达式的疑问

[复制链接]
发表于 2020-10-9 23:56:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小白表达能力弱,辞不达意,请大神嘴下留情,我哪里说得不清楚,麻烦耐心指出来。我再想办法说清楚。


下面是某视频教程的代码。

我对12行和20行中的数据解析不太懂。

#12行:host_li_list = tree.xpath('//div[@class="bottom"]/ul/li')
#20行:city_names_list = tree.xpath('//div[@class="bottom"]/ul/div[2]/li')

在网站的网页的源码中,有两个div, class = bottom, 但是它们的父级都不一样。(见截图)
第一个div class=bottom:  是热门城市
第二个div class=bottom:  是全部成市

但是在这个爬虫虫的代码中,没有写不同的父级,直接跳到div[@class="bottom"], 程序能搞清楚,到底是要解析哪个div class=bottom的数据吗?

难道程序是先去试第一个表达式12行,如果成立,就不会往下走了;如果不成立,去试20行?

                               
登录/注册后可看大图
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()')[0]
         all_city_names.append(hot_city_name)
    
     #解析的是全部城市的名称
     city_names_list = tree.xpath('//div[@class="bottom"]/ul/div[2]/li')
     for li in city_names_list:
         city_name = li.xpath('./a/text()')[0]
         all_city_names.append(city_name)
    
     print(all_city_names,len(all_city_names))
最佳答案
2020-10-10 01:32:16
不是这么理解的吧,
我猜,应该是,和windows的文件路径一样,

把整个xpath('//div[@class="bottom"]/ul/li')当成一个路径来看,能找到,就返回了,找不到,就报错了
至于class相同也不影响啊,整体的路径不一样,找到数据就行了

不知道这样理解对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-10 01:32:16 | 显示全部楼层    本楼为最佳答案   
不是这么理解的吧,
我猜,应该是,和windows的文件路径一样,

把整个xpath('//div[@class="bottom"]/ul/li')当成一个路径来看,能找到,就返回了,找不到,就报错了
至于class相同也不影响啊,整体的路径不一样,找到数据就行了

不知道这样理解对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 09:25:59 From FishC Mobile | 显示全部楼层
其实这个么有影响,除非子节点是一样的,它是获取全部class为bottom的div,然后再继续往下找,如果两个div都有同一个子节点ul,则都返回,如果没有,则返回其中一个,所以不影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 09:26:05 | 显示全部楼层
xpath会把所有符合规则的路径都找到,比如第12行,'//div[@class="bottom"]/ul/li',会把所有符合这个路径的标签及标签下文字都找到,放在列表里,所以写xpath时,不用去管程序搞不搞得清楚父级是什么,只需要把xpath路径写得唯一就行,这样,楼主就就能理解了吧?在看第20行,能满足这个路径的,只有页面源代码里的
全部城市那里,所以,楼主的关注点要改一下,就好理解了!望采纳!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 11:48:47 | 显示全部楼层
谢谢你们三位大神的热心帮助。

你们说的在我看来都是一个意思,所以我选择第一个回复我的大神当最佳。其他两位,小白再次表示非常感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 10:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表