使用BeautifulSoup通过类属性统计列表元素遇空数组问题求助
问题:使用BeautifulSoup统计列表元素返回空数组的解决方法
问题背景
尝试用BeautifulSoup统计列表元素数量时返回空数组,确认之前代码可正常运行,当前HTML结构如下:
<div class="row"> ... <div class="style_details"> <ul data-id="list" class="listing_details"> <li data-id="listing-index-1"></li> <li data-id="listing-index-2"></li> <li data-id="listing-index-3"></li> </ul> </div>
使用的代码片段:
browser.get(url) c = browser.page_source soup = BeautifulSoup(c, "html.parser") dom = etree.HTML(str(soup)) data = soup.findAll('li',attrs={'class':'listing_details'}) links = len(data) return links
问题原因
和嵌套无关,是选择器目标错误:你在代码里查找class为listing_details的<li>标签,但实际HTML中listing_details是<ul>的class属性,<li>并没有这个class,所以返回空数组。如果之前代码能运行,大概率是页面HTML结构发生了变化。
解决方法
方法1:先定位目标<ul>再统计子元素<li>数量
browser.get(url) c = browser.page_source soup = BeautifulSoup(c, "html.parser") # 定位class为listing_details的ul target_ul = soup.find('ul', class_='listing_details') # 统计该ul下的li数量,避免ul不存在时报错 links = len(target_ul.find_all('li')) if target_ul else 0 return links
方法2:使用CSS选择器直接定位目标<li>
CSS选择器更简洁直观,可一步选中目标<ul>下的所有<li>:
browser.get(url) c = browser.page_source soup = BeautifulSoup(c, "html.parser") # 用CSS选择器选中ul.listing_details下的所有li标签 li_elements = soup.select('ul.listing_details li') links = len(li_elements) return links
额外优化
代码中dom = etree.HTML(str(soup))这一行未被使用,属于冗余代码,可直接删除。
内容的提问来源于stack exchange,提问作者DCUpro
相关产品推荐
相关产品推荐

