如何用BeautifulSoup遍历搜索结果列表并提取指定信息?
解决方案
首先,你用find_all得到的ordered_list是一个列表,需要先获取到具体的目标有序列表元素,再遍历其中的每个结果项(<li>)来提取信息。以下是完整的实现代码:
result = session.get(url) soup = BeautifulSoup(result.text, 'html.parser') # 获取目标有序列表(取第一个匹配的ol元素) search_results_ol = soup.find_all('ol', class_='searchResults')[0] # 初始化目标格式的容器 output = { 'title': [], 'link': [], 'description': [], 'timestamp': [] } # 遍历每个结果项 for li in search_results_ol.find_all('li'): # 提取标题与链接 a_tag = li.find('a') if a_tag: output['title'].append(a_tag.get_text(strip=True)) output['link'].append(a_tag['href']) else: # 处理无匹配元素的情况,避免报错 output['title'].append(None) output['link'].append(None) # 提取描述,无描述时使用默认文本 desc_tag = li.find('p', class_='description') output['description'].append(desc_tag.get_text(strip=True) if desc_tag else 'No description provided') # 提取时间戳:优先取li的data-timestamp属性,无属性则取页面显示的时间文本 timestamp = li.get('data-timestamp') if not timestamp: time_tag = li.find('span', class_='timestamp') timestamp = time_tag.get_text(strip=True) if time_tag else None output['timestamp'].append(timestamp) # 输出结果 print(output)
关键步骤说明
- 获取目标列表:
find_all返回所有匹配的<ol>元素,这里取第一个([0]),如果页面有多个同类型列表,需要根据实际情况调整筛选条件。 - 遍历结果项:通过
search_results_ol.find_all('li')获取所有结果条目,逐个处理。 - 信息提取:
- 标题和链接从条目内的
<a>标签提取,get_text(strip=True)会自动去除文本前后的空格; - 描述优先查找对应的
<p>标签,找不到时使用你指定的默认文本; - 时间戳优先读取
<li>的data-timestamp属性(更准确的原始数据),如果没有则提取页面显示的时间文本。
- 标题和链接从条目内的
如果实际HTML结构中的标签类名或层级和代码假设的不同,只需调整find方法的参数即可(比如修改描述标签的类名、时间戳元素的选择器)。
内容的提问来源于stack exchange,提问作者BGreeneGiant
相关产品推荐
相关产品推荐

