You need to enable JavaScript to run this app. Python中如何提取网页内嵌超链接对应页面的数据并补充至DataFrame?
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何提取网页内嵌超链接对应页面的数据并补充至DataFrame?

实现逻辑

你当前用pd.read_html只能解析表格的可见文本,无法提取单元格内嵌的超链接属性,需要按以下步骤补充详情数据:

  1. 用HTML解析库定位列表页表格的每一行,提取对应Details超链接的目标地址,补全为可直接请求的完整URL
  2. 将提取好的URL列表和现有DataFrame按行对齐,新增一列存储详情页地址
  3. 逐行请求对应详情页,解析需要的字段值,作为新列合并到原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 02:57:04