使用BeautifulSoup提取li时遇div截断的解决方法
问题原因
提取不全li标签的核心原因是:目标移动端维基页面的mf-section-2板块中,Nacimientos(出生记录)板块的列表被中间插入的<div>标签(多为移动端广告位、编辑入口、折叠功能模块)拆成了多个平级的<ul>节点。原有代码只通过filtro.find('ul')获取了板块下第一个ul标签内的li,div之后其他ul下的li自然全部被遗漏,和解析器、next_sibling方法的调用逻辑没有关系。
修复代码
直接在定位到的目标板块节点下递归搜索所有li标签即可,不需要手动处理兄弟节点、跳过div标签,BeautifulSoup的find_all方法会自动遍历所有子节点完成匹配,修正后的可运行代码如下:
import requests from bs4 import BeautifulSoup url = "https://es.m.wikipedia.org/wiki/9_de_julio" wikipedia2 = requests.get(url) year_list = [] if wikipedia2.status_code == 200: nacimientos2 = BeautifulSoup(wikipedia2.text, "lxml") # 定位Nacimientos所在板块 filtro = nacimientos2.find("section", id="mf-section-2") # 提取板块下所有li标签,自动忽略中间div的隔断 all_li = filtro.find_all("li") for item in all_li: content = item.text.strip() # 校验前四位为数字,过滤掉板块内非年份的列表项(如脚注、功能入口) if len(content)>=4 and content[:4].isdigit(): year_list.append(content[:4]) else: print("页面响应错误,状态码:", wikipedia2.status_code) print(year_list)
原有代码的其他问题
- 异常分支变量名笔误:原代码请求失败时打印的
wikipedia.status_code对应变量不存在,实际定义的响应对象变量名为wikipedia2 - 缺少导入语句:原代码没有导入
BeautifulSoup类,直接调用soup()会触发命名错误 - 缺少内容校验:直接截取文本前4位可能拿到非年份的无效内容,增加数字校验可以保证提取结果的准确性
内容的提问来源于stack exchange,提问作者ildanix
相关产品推荐
相关产品推荐

