使用BeautifulSoup提取列表时保留URL属性并捕获日期的技术问题
解决方法
核心问题分析
你当前代码的主要问题:
- 错误地通过
<span>标签提取内容,但目标页面的<li>里并没有<span>,导致无法拿到正确的part1和part2 - 没处理日期标签(h3)与对应
<li>的关联逻辑 - 未提取
<a>标签的href属性
修正后的代码
from bs4 import BeautifulSoup import pandas as pd with open("myfile.html", "r") as og_file: page = og_file.read() soup = BeautifulSoup(page, "html5lib") # 存储最终数据 scrape_data = [] current_date = "" # 遍历所有h3和li元素,跟踪当前日期 for element in soup.find_all(['h3', 'li']): if element.name == 'h3': # 更新当前日期,去除多余空格 current_date = element.text.strip() elif element.name == 'li': # 提取part1:冒号前的文本 part1 = element.text.split(':')[0].strip() # 找到li里的a标签 a_tag = element.find('a') if a_tag: part2 = a_tag.text.strip() url = a_tag.get('href') # 将数据加入列表 scrape_data.append({ "date": current_date, "part1_of_rowN": part1, "Part2_of_rowN": part2, "url_for_rowN": url }) # 生成DataFrame并保存为CSV df = pd.DataFrame(scrape_data) df.to_csv('scrape.csv', index=False)
代码说明
- 遍历页面中的
h3和li元素,遇到h3就更新当前日期,确保后续的li都关联正确的日期(如果页面里的日期标签是<h2>而非<h3>,把代码中的['h3', 'li']改成['h2', 'li']即可) - 对每个
li,通过冒号拆分获取part1,再直接从<a>标签提取文本和链接 - 最终生成符合需求的四列CSV,自动忽略没有
<a>标签的无效li(如果有的话)
内容的提问来源于stack exchange,提问作者cube-convict
相关产品推荐
相关产品推荐

