Python中如何提取网页内嵌超链接对应页面的数据并补充至DataFrame?
实现逻辑
你当前用pd.read_html只能解析表格的可见文本,无法提取单元格内嵌的超链接属性,需要按以下步骤补充详情数据:
- 用HTML解析库定位列表页表格的每一行,提取对应
Details超链接的目标地址,补全为可直接请求的完整URL - 将提取好的URL列表和现有DataFrame按行对齐,新增一列存储详情页地址
- 逐行请求对应详情页,解析需要的字段值,作为新列合并到原有DataFrame中
可落地的代码示例
import pandas as pd import requests import time from bs4 import BeautifulSoup # 基础配置 BASE_URL = "https://webgate.ec.europa.eu/rasff-window/portal/" HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 1. 请求列表页 list_page_url = BASE_URL + "?event=notificationsList&StartRow=" resp = requests.get(list_page_url, headers=HEADERS) soup = BeautifulSoup(resp.text, "html.parser") # 2. 提取所有行对应的Details链接 detail_link_list = [] # 定位和你代码中一致的最后一个表格 target_table = soup.find_all("table")[-1] # 跳过表头行,遍历所有数据行 for row in target_table.find_all("tr")[1:]: cells = row.find_all("td") # 每行最后一个单元格内嵌的a标签就是Details链接 detail_a_tag = cells[-1].find("a") if detail_a_tag and "Details" in detail_a_tag.get_text(strip=True): # 拼接完整请求URL full_detail_url = BASE_URL + detail_a_tag["href"].lstrip("/") detail_link_list.append(full_detail_url) else: detail_link_list.append(None) # 3. 生成原有列表DataFrame,和你之前的逻辑保持一致 df = pd.read_html(resp.text)[-1] # 把提取到的链接作为新列追加 df["detail_url"] = detail_link_list # 4. 定义详情页解析函数,根据你需要的字段调整 def parse_detail_content(url): if not url: return pd.Series([None, None, None]) # 加请求延迟,避免被反爬 time.sleep(1) try: detail_resp = requests.get(url, headers=HEADERS, timeout=10) detail_soup = BeautifulSoup(detail_resp.text, "html.parser") # 以下为示例字段,可替换为你实际需要采集的详情内容 risk_type = detail_soup.find("span", {"id": "riskType"}).get_text(strip=True) if detail_soup.find("span", {"id": "riskType"}) else None product_desc = detail_soup.find("td", {"class": "productDesc"}).get_text(strip=True) if detail_soup.find("td", {"class": "productDesc"}) else None notify_country = detail_soup.find("span", {"id": "memberState"}).get_text(strip=True) if detail_soup.find("span", {"id": "memberState"}) else None return pd.Series([risk_type, product_desc, notify_country]) except Exception: return pd.Series([None, None, None]) # 逐行解析详情页内容,追加为新列 df[["risk_type", "product_desc", "notify_country"]] = df["detail_url"].apply(parse_detail_content)
实操注意点
- 请求时带上模拟浏览器的请求头,避免被站点反爬机制直接拦截
- 详情页爬取时建议保持1-2秒的间隔,不要短时间内发送高频请求,防止IP被临时封禁
- 解析详情页字段时,可通过浏览器开发者工具的元素选择器,定位目标内容对应的HTML标签选择规则,替换示例代码中的定位逻辑即可
- 若需要采集多页列表数据,只需调整URL中的
StartRow参数(按页面显示条数逐页递增),重复上述流程后合并所有分页的DataFrame即可
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

