requests_html爬取网页遇空白CSV问题,因目标站HTML结构差异求助
问题解决与代码修正
核心问题分析
- 会话未初始化:代码中使用
r = s.get(url)但未创建HTMLSession实例,会直接抛出NameError。 - 数据列表未定义:
data.append(entry_dict)中的data没有提前声明为空列表,运行会报错。 - 选择器不匹配目标网站结构:当前使用的
div.bw-news-list li选择器无法定位到实际的新闻条目,导致没有数据被抓取。 - 未实现前3条结果限制:代码会遍历所有条目,没有做数量限制。
- CSV写入逻辑未处理追加需求:当前代码会直接覆盖文件,而非追加。
修正后的代码
from requests_html import HTMLSession import pandas as pd # 初始化会话和数据列表 s = HTMLSession() data = [] urls = [ 'https://www.businesswire.com/portal/site/home/search/?searchType=all&searchTerm=delix&searchPage=1', ] for url in urls: r = s.get(url) # 修正选择器:定位实际的新闻条目容器(适配当前BusinessWire结构) content = r.html.find('div.search-results-list div.search-result-item') # 只取前3条结果 for item in content[:3]: try: title = item.find('h3.search-result-title a', first=True).text except Exception as e: print(f"获取标题出错: {e}") title = '' try: date = item.find('div.search-result-meta span.search-result-date', first=True).text except Exception as e: print(f"获取日期出错: {e}") date = '' try: summary = item.find('div.search-result-summary', first=True).text except Exception as e: print(f"获取摘要出错: {e}") summary = '' try: news_url = item.find('h3.search-result-title a', first=True).absolute_links.pop() except Exception as e: print(f"获取链接出错: {e}") news_url = '' entry_dict = { 'Title': title, 'Date': date, 'Summary': summary, 'URL': news_url } data.append(entry_dict) # 处理CSV追加:检查文件是否存在,不存在则写表头,存在则跳过表头 try: # 尝试读取现有文件,判断是否需要追加表头 pd.read_csv('BusinessWire_Information.csv') df = pd.DataFrame(data) df.to_csv('BusinessWire_Information.csv', mode='a', index=False, header=False) except FileNotFoundError: # 文件不存在时写入表头和数据 df = pd.DataFrame(data) df.to_csv('BusinessWire_Information.csv', index=False) print('完成')
关键修正说明
- 选择器适配:根据当前BusinessWire搜索结果的HTML结构,将选择器更新为
div.search-results-list div.search-result-item,并对应调整子元素的选择器(标题、日期、摘要等)。 - 会话与数据初始化:添加
s = HTMLSession()和data = []解决未定义问题。 - 前3条限制:通过
content[:3]只遍历前3个条目。 - CSV追加逻辑:通过
try-except判断文件是否存在,实现首次写入表头、后续追加数据不重复写表头的需求。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

