部分ul无li子元素时从ul数组中爬取li元素的Python爬虫问题求解
问题修复方案
第一套方案异常触发的根因与修复
你第二块try代码块报错的核心原因是没有对<ul>下是否存在<li>做前置判空,大概率是你直接对空的li查询结果执行了取值操作,同时异常捕获范围过大掩盖了具体错误。
修正逻辑如下:
- 遍历每个
<ul>时,先调用find_all('li')获取子元素,结果为空直接跳过当前ul - 缩小异常捕获范围,仅捕获解析过程中可能出现的格式异常
修正代码参考:
from bs4 import BeautifulSoup # 替换为你的实际HTML内容 html = """你附上的HTML样例内容""" soup = BeautifulSoup(html, "html.parser") result = [] for ul in soup.find_all("ul"): li_list = ul.find_all("li") # 无li子元素直接跳过 if not li_list: continue for li in li_list: text = li.get_text(strip=True) if text: result.append(text) # 逐行输出 for item in result: print(item)
第二套方案无法换行的修复
你第二套方案没有单独换行的核心原因是把所有<li>的文本做了合并输出,没有拆分单个<li>的结果。你可以直接用select选择器全局匹配所有<ul>下的<li>,自动跳过无li的ul,同时逐行输出:
from bs4 import BeautifulSoup soup = BeautifulSoup(html, "html.parser") # 直接选择所有ul的直接子li元素,自动过滤没有li的ul for li in soup.select("ul > li"): print(li.get_text(strip=True))
如果你需要把结果存入变量后再统一输出,用'\n'.join()拼接列表即可:
result = [li.get_text(strip=True) for li in soup.select("ul > li") if li.get_text(strip=True)] print('\n'.join(result))
内容的提问来源于stack exchange,提问作者GavSpooner
相关产品推荐
相关产品推荐

