如何使用BeautifulSoup提取HTML列表li子元素内指定span的文本
问题原因
你原有代码的选择器仅定位到了li.two-columns_a节点,调用.text属性会默认提取该节点下所有后代节点的文本内容并拼接,所以会把每个li下两个span的文本都返回,不符合只提取class="red"的span文本的需求。
调整方案
你可以直接在CSS选择器中追加定位条件,精准选中目标span节点,以下是几种可行写法:
写法1:单条精准定位
data['something1'] = soup.select("li.two-columns_a:nth-child(1) span.red")[0].text.strip() data['something2'] = soup.select("li.two-columns_a:nth-child(2) span.red")[0].text.strip() data['something3'] = soup.select("li.two-columns_a:nth-child(3) span.red")[0].text.strip()
写法2:批量提取后按顺序赋值(效率更高,仅需一次DOM查询)
# 一次性拿到所有符合条件的red类span节点 red_span_list = soup.select("li.two-columns_a span.red") data['something1'] = red_span_list[0].text.strip() data['something2'] = red_span_list[1].text.strip() data['something3'] = red_span_list[2].text.strip()
写法3:在原有li节点基础上二次筛选
如果你需要保留原有li节点的查询逻辑,可以在拿到li节点后再筛选内部的red span:
li_list = soup.select("li.two-columns_a") data['something1'] = li_list[0].select_one("span.red").text.strip() data['something2'] = li_list[1].select_one("span.red").text.strip() data['something3'] = li_list[2].select_one("span.red").text.strip()
内容的提问来源于stack exchange,提问作者Thoms
相关产品推荐
相关产品推荐

