使用BeautifulSoup提取网页第6个合规信息表格遇阻求助
解决无法提取合规信息表格数据的问题
我看了你的代码和目标网页,问题主要出在表格定位和数据提取的逻辑上,咱们一步步来修正:
1. 先梳理现有代码的核心问题
- 你的
link列表仅包含一个URL,但循环里用了未定义的start和end参数,导致循环逻辑混乱 - 提取表格数据时,
item.find_all("td", {"class": "tabletitle"})[0].table的写法完全错误,没法正确抓取表格的行数据 - 文件写入环节的列名和数据结构不匹配,最终输出的内容会不符合预期
2. 修正后的完整可运行代码
import requests import random import time from bs4 import BeautifulSoup import unicodecsv # 目标网页URL target_url = "http://ec.europa.eu/environment/ets/ohaDetails.do?returnURL=&languageCode=en&accountID=®istryCode=&buttonAction=all&action=&account.registryCode=&accountType=&identifierInReg=&accountHolder=&primaryAuthRep=&installationIdentifier=&installationName=&accountStatus=&permitIdentifier=&complianceStatus=&mainActivityType=-1&searchType=oha&resultList.currentPageNumber=1&nextList=Next%C2%A0%3E&selectedPeriods=" # 添加请求头模拟浏览器,避免被服务器拦截 request_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 发送请求并解析页面 response = requests.get(target_url, headers=request_headers) time.sleep(random.randint(2, 5)) soup = BeautifulSoup(response.content, "lxml") # 获取所有class为bordertb的表格,目标是第6个(索引为5,因为列表从0开始计数) all_tables = soup.find_all("table", class_="bordertb") if len(all_tables) < 6: print("未找到第6个表格,请检查页面结构是否发生变化") exit() compliance_table = all_tables[5] # 提取表格的表头和数据行 output_data = [] # 提取表头 header_row = compliance_table.find("tr", class_="tabletitle") if header_row: table_headers = [td.get_text(strip=True) for td in header_row.find_all("td")] output_data.append(table_headers) # 提取所有数据行(跳过表头行) data_rows = compliance_table.find_all("tr")[1:] for row in data_rows: row_cells = [td.get_text(strip=True) for td in row.find_all("td")] if row_cells: # 过滤空行 output_data.append(row_cells) # 将数据写入TSV文件 with open("Exhibit_2_EXP_data.tsv", "wb") as outfile: writer = unicodecsv.writer(outfile, delimiter="\t") writer.writerows(output_data) print("合规信息表格数据提取完成,已保存到Exhibit_2_EXP_data.tsv")
3. 关键修正点说明
- 模拟浏览器请求:添加
User-Agent请求头,避免服务器拒绝非浏览器发起的请求 - 精准定位目标表格:直接通过列表索引
all_tables[5]获取第6个表格,符合页面结构的实际情况 - 正确提取行数据:先抓取表头,再遍历所有数据行,逐个提取单元格的文本内容,确保数据结构完整
- 优化文件写入:使用
writerows一次性写入整个二维列表,保证表头和数据行一一对应
如果后续页面结构发生变化,你可以通过浏览器开发者工具(F12)检查目标表格的class或其他属性,调整定位逻辑即可。
内容的提问来源于stack exchange,提问作者Varun
相关产品推荐
相关产品推荐

