如何使用 Pandas 直接提取 HTML 表格中指定列的超链接(而非文本)

1次阅读

如何使用 Pandas 直接提取 HTML 表格中指定列的超链接(而非文本)

本文详解如何利用 pandas.read_html 的 extract_links 参数配合数据清洗,从网页表格中精准提取超链接并构造完整 url,避免依赖 beautifulsoup,实现纯 pandas 流程化网页结构化数据采集。

本文详解如何利用 pandas.read_html 的 extract_links 参数配合数据清洗,从网页表格中精准提取超链接并构造完整 url,避免依赖 beautifulsoup,实现纯 pandas 流程化网页结构化数据采集。

在使用 pandas.read_html() 抓取网页表格时,若目标列包含 文本 形式的超链接(如 ESPNcricinfo 的“Scorecard”列),默认仅返回可见文本,丢失关键跳转信息。虽然 extract_links 参数支持提取链接,但其输出格式为 (text, href) 元组,且 href 多为相对路径或缺失协议,需进一步处理才能获得可用 URL。

核心解决方案:extract_links=”body” + 列级元组解析 + 基础 URL 拼接

pandas.read_html(url, extract_links=”body”) 会将表格中所有 标签所在单元格替换为 (link_text, href) 元组(无链接则为 (text, None))。随后通过 apply() 对每列进行向量化处理,提取 href 并补全协议与域名:

import pandas as pd  url = 'https://www.espncricinfo.com/records/year/team-match-results/2005-2005/twenty20-internationals-3' base_url = 'https://www.espncricinfo.com'  # 提取整表,所有含链接的单元格变为 (text, href) 元组 table = pd.read_html(url, extract_links="body")[0]  # 遍历每列,解包元组:取 href;若为 None 则保留原文本(极少发生);否则拼接 base_url table = table.apply(     lambda col: [         v[1] if v[1] is not None else v[0]  # 优先取 href,无链接时回退到文本         for v in col     ] )  # 若 href 为相对路径(如 "/series/xxx"),需手动补全 # 此处示例中 href 已含完整路径,但通用做法如下: table = table.apply(     lambda col: [         f"{base_url}{v[1]}" if v[1] and v[1].startswith('/') else          v[1] if v[1] else v[0]         for v in col     ] )

关键优势

立即学习前端免费学习笔记(深入)”;

  • 零外部依赖:全程仅用 pandas,无需 BeautifulSoup 或 lxml;
  • 列粒度可控:extract_links=”body” 作用于全部数据单元格,后续可对特定列(如 “Scorecard”)单独处理,避免污染其他列;
  • URL 可靠性高:显式拼接 base_url 确保链接可直接访问,规避相对路径失效风险。

⚠️ 注意事项

进阶技巧:仅处理目标列,提升效率与安全性
若只需 “Scorecard” 列的链接,可先提取该列再处理,避免遍历无关列:

scorecard_col = table.iloc[:, -1]  # 假设 Scorecard 是最后一列 scorecard_links = [     f"{base_url}{v[1]}" if v[1] else None     for v in scorecard_col ] table["Scorecard_URL"] = scorecard_links table = table.drop(columns=[table.columns[-1]])  # 删除原始文本列

至此,你已获得一个结构清晰、链接可用的 Pandas DataFrame,可直接用于后续分析、存储或批量请求详情页。这一方法平衡了简洁性与鲁棒性,是动态网页静态表格链接提取的推荐实践。

text=ZqhQzanResources