如何使用BeautifulSoup从指定根元素快速获取多层嵌套的目标<a>标签?
使用BeautifulSoup快速定位嵌套的标签
既然你已经定位到了cust-attrib-id="root"的根元素,其实完全可以用CSS选择器的层级语法直接一步到位,既快捷又能保证查询的精准性(避免页面其他地方的region-title干扰)。
最简实现方式
首先建议用select_one直接获取单个根元素(如果页面只有一个root节点的话,比select返回列表更方便):
from bs4 import BeautifulSoup soup = BeautifulSoup(source, "html.parser") root = soup.select_one('div[cust-attrib-id="root"]')
然后直接在根元素上使用层级选择器,精准定位目标<a>标签:
# 获取所有符合条件的<a>标签的文本内容 city_names = [a.get_text(strip=True) for a in root.select('div[cust-attrib-id="country"] div[cust-attrib-id="region-title"] a')]
执行后city_names就会得到['Frankfurt', 'Braunschweig', 'Hamm', ...]这样的结果。
选择器说明
这个选择器的逻辑是:
- 从
root元素的子树开始查找 - 先定位到
cust-attrib-id="country"的<div> - 再找到它下面所有
cust-attrib-id="region-title"的<div> - 最后取出这些
<div>里的<a>标签
这样的层级嵌套完全符合你的需求,既跳过了手动逐层遍历的繁琐,又通过限定父级节点避免了误选页面其他位置的region-title元素。
备选链式查找方式
如果你更习惯用BeautifulSoup的find_all链式调用,也可以这样写:
city_names = [] # 只在root下查找region-title的div for region_div in root.find_all('div', attrs={'cust-attrib-id': 'region-title'}): a_tag = region_div.find('a') if a_tag: city_names.append(a_tag.get_text(strip=True))
不过相比之下,CSS选择器的写法更简洁直观。
内容的提问来源于stack exchange,提问作者IAMYB
相关产品推荐
相关产品推荐

