青松100 发表于 2020-10-9 23:56:06

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))

疾风怪盗 发表于 2020-10-10 01:32:16

不是这么理解的吧,
我猜,应该是,和windows的文件路径一样,

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

不知道这样理解对不对

bonst 发表于 2020-10-10 09:25:59

其实这个么有影响,除非子节点是一样的,它是获取全部class为bottom的div,然后再继续往下找,如果两个div都有同一个子节点ul,则都返回,如果没有,则返回其中一个,所以不影响

弱弱的佳佳 发表于 2020-10-10 09:26:05

xpath会把所有符合规则的路径都找到,比如第12行,'//div[@class="bottom"]/ul/li',会把所有符合这个路径的标签及标签下文字都找到,放在列表里,所以写xpath时,不用去管程序搞不搞得清楚父级是什么,只需要把xpath路径写得唯一就行,这样,楼主就就能理解了吧?在看第20行,能满足这个路径的,只有页面源代码里的
全部城市那里,所以,楼主的关注点要改一下,就好理解了!望采纳!!!

青松100 发表于 2020-10-10 11:48:47

谢谢你们三位大神的热心帮助。

你们说的在我看来都是一个意思,所以我选择第一个回复我的大神当最佳。其他两位,小白再次表示非常感谢。
页: [1]
查看完整版本: python:xpath表达式的疑问