Python爬虫如何抓取表格中的嵌套链接_利用bs4选择器深入解析

陌杰同学_5904

陌杰同学_5904

2026-05-03

557人浏览

原创

正确提取表格中a标签需精确定位到目标单元格再查找,避免全局递归误取;须处理空值、相对链接补全及javascript动态渲染等情况。

python爬虫如何抓取表格中的嵌套链接_利用bs4选择器深入解析

表格里 a 标签藏在 td 里,直接 find_all("a") 会漏数据

常见错误是先 find("table"),再对整个表格对象调用 find_all("a")——这会把表头、脚注甚至隐藏的广告链接全抓进来,根本分不清哪个 a 属于哪一行哪一列。真正要的是「每行中第三列里的链接」或「带特定 class 的单元格里的第一个链接」这类精确路径。

正确做法是先定位到目标 tr 行(比如跳过表头),再用 .select("td:nth-of-type(3) a") 或链式调用 row.find("td", {"class": "link-col"}).find("a")。注意:如果某行该列为空或没有 a,直接 .get("href") 会报 AttributeError,必须加判断:

for row in table.select("tr")[1:]:  # 跳过表头
    link_cell = row.select_one("td:nth-of-type(3)")
    if link_cell:
        a_tag = link_cell.find("a")
        if a_tag and a_tag.get("href"):
            urls.append(a_tag["href"])

select() 和 find_all() 在嵌套表格场景下行为不一致

当表格本身嵌套了子表格(比如某 td 里又有一个 table),find_all("a") 默认递归搜索所有后代,容易跨层级误取;而 select("td a") 是 CSS 选择器,只匹配 td 直接后代的 a,但若写成 select("td a, td table a") 就能显式覆盖两层。

更稳妥的方式是限制作用域:先 td = row.find("td", {"data-role": "detail"}),再在这个 td 对象上调用 .select("a[href]")。这样即使内部有子表格,也不会污染外层逻辑。

  • find_all("a") 在父节点上调用 → 全局递归,不可控
  • parent.select("td a") → 只找 parent 下 td 内的 a,但可能跨子表格
  • td.find("a") 或 td.select_one("a") → 严格限定在当前 td 节点树内

相对链接没补全?urljoin() 必须在提取后立刻做

表格里 a 的 href 经常是 /item/123 或 ../detail?id=456,直接存会导致后续请求 404。不能等到全部链接收集成列表再统一处理,因为不同表格行可能来自不同 base URL(比如页面含 iframe 或动态加载的区块)。

提示词大师-python版
提示词大师-python版

图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍

下载

必须在每条链接提取后、存入列表前就补全:

from urllib.parse import urljoin
...
base_url = "https://example.com/list/page1"
# 假设这是当前页面 URL,不是硬编码
if a_tag.get("href"):
    full_url = urljoin(base_url, a_tag["href"])
    urls.append(full_url)

注意:urljoin() 对空字符串、锚点(#section)、完整 URL 都安全,但不会修正拼写错误(如 http//),这种得靠正则或 requests.utils.requote_uri() 二次校验。

遇到 JavaScript 渲染的表格怎么办?bs4 本身无解

bs4 只解析原始 HTML,如果表格内容由 fetch() 或 Vue.mount() 动态注入,源码里根本找不到 tr 和 a。这时候别硬刚选择器,先看 Network 面板:多数情况是数据走 API,返回 JSON,比解析 DOM 简单得多。

实在要渲染后抓取,得换工具:selenium 启动浏览器、等 document.querySelectorAll("table tr a") 出现;或用 playwright 截图+OCR(极端情况)。但绝大多数业务表格都有对应接口,花十分钟找 XHR 请求比写十页等待逻辑更可靠。

一个容易被忽略的细节:有些网站用 data-url 属性存链接,a 标签本身是空的或只有文字,这时候得查 a.get("data-url") or a.get("href"),而不是只盯着 href。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1651

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4044

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1649

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23417

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2867

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2907

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1143

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2243

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程