如何使用Python的BeautifulSoup跳过<ul>的第一个元素?
如何用BeautifulSoup直接排除第一个元素获取车辆链接和名称?
当然有办法直接通过BeautifulSoup的选择器语法跳过第一个「All Cars」对应的<li>元素,不用在循环里手动判断跳过。这里给你几种简洁的实现方式,都是利用CSS选择器或者BeautifulSoup的过滤能力来直接定位目标元素:
方法1:使用CSS伪类:nth-of-type(n+2)
这个伪类可以直接选中列表里第2个及之后的所有<li>元素,完美跳过第一个项:
from bs4 import BeautifulSoup html = '''<ul class="nav nav--stacked" id="designer-list"> <li> <h2> <a class="text-uppercase bold router-link-active" href="/en-ca/cars_all"> All Cars </a> </h2> </li> <li> <a href="/en-ca/cars/c1"> <span> The car c1 </span> </a> </li> <li> <a href="/en-ca/cars/c2"> <span> The car c2 </span> </a> </li> </ul>''' soup = BeautifulSoup(html, 'html.parser') # 直接选取第2个及之后的li元素 car_items = soup.select('#designer-list li:nth-of-type(n+2)') for item in car_items: href = item.find('a')['href'] car_name = item.find('span').get_text(strip=True) print(f"{href} => {car_name}")
方法2:使用相邻兄弟选择器~
li ~ li会选中所有跟在第一个<li>之后的同级<li>元素,效果和上面完全一致:
# 替换上面的car_items行即可 car_items = soup.select('#designer-list li ~ li')
方法3:通过元素特征排除第一个项
第一个<li>里包含<h2>标签,而其他车辆项没有,我们可以用:not(:has(h2))来精准排除包含<h2>的<li>:
# 替换上面的car_items行即可 car_items = soup.select('#designer-list li:not(:has(h2))')
方法4:用BeautifulSoup的find_all结合lambda过滤
如果你更习惯用BeautifulSoup原生的find_all方法,也可以用lambda表达式来过滤元素:
car_items = soup.find_all('li', lambda tag: tag.parent.get('id') == 'designer-list' and not tag.find('h2'))
这几种方法都能直接拿到目标的车辆项,无需在循环里手动跳过第一个元素,代码更简洁且语义明确。
内容的提问来源于stack exchange,提问作者IgorAlves
相关产品推荐
相关产品推荐

