HTML本身不提供文本提取能力,真正执行提取的是JavaScript、Python解析器或n8n等工具:浏览器控制台用document.body.innerText可快速获取渲染后可见文本;BeautifulSoup的get_text()适合批量处理,加参数可保留换行;n8n的HTML节点需正确配置JSON属性与CSS选择器,且不支持XPath。

HTML 本身不提供“提取文本”的能力——它只是标记语言,负责描述结构;真正做提取的,是 JavaScript、Python 解析器或 n8n 这类工具。直接在 HTML 文件里写 <html> 标签不会自动抽文本,必须靠外部逻辑驱动。
用浏览器控制台快速提取当前页纯文本
适合临时调试、验证目标内容是否可读,无需安装任何东西:
- 打开目标网页,按
F12→ 切到Console面板 - 输入
document.body.innerText回车,得到渲染后全部可见文本(含换行,但无格式) - 若只要某一块,比如所有
<h2>标题:输入[...document.querySelectorAll('h2')].map(el => el.innerText).join('\n') - ⚠️注意:
innerText会忽略display: none或被 JS 动态隐藏的内容;想获取原始 HTML 内所有文本(包括隐藏的),改用document.body.textContent
用 BeautifulSoup(Python)从 HTML 字符串中稳定提文本
适合批量处理本地文件或 requests 抓回的响应体,比正则更鲁棒:
-
soup.get_text()是最常用入口,但默认会把换行压成空格;需保留段落结构时加参数:soup.get_text(separator='\n', strip=True) - 若 HTML 中有大量广告/导航栏干扰,先定位主体再提:
soup.find('main') or soup.find('article') or soup.body,再调.get_text() - 遇到嵌套结构想只取父元素的“直接子文本”(跳过
<h1>、<span>里的文字),用soup.select_one('div.classA::text')(需配合cssutils或 lxml 后端,标准 bs4 不支持::text) - 别用
.string——它只在标签内**只有纯文本且无子标签**时才返回值,否则是None
n8n 的 HTML 节点怎么配才不丢数据
当流程中已有 HTTP 请求节点返回 HTML,下一步用 HTML 节点提取时,常见失败不是选择器错,而是上下文没对准:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
立即学习“前端免费学习笔记(深入)”;
- 确保上游节点输出的 JSON 里,HTML 内容确实在你填的
JSON 属性字段下,比如 HTTP 节点默认存进body,那就填body;如果用了Response Format设为File,那实际是二进制,HTML 节点会报错 - CSS 选择器填
.price却提取不到?检查是否页面用了 Shadow DOM 或动态加载——n8n HTML 节点解析的是静态 HTML 字符串,不执行 JS;此时得先用 Puppeteer 或 Browser Automation 节点渲染完再传给 HTML 节点 - 想提取多个同类项(如全部商品名),必须勾选
返回数组,否则只取第一个匹配项;同时键(Key)填的字段名会成为输出 JSON 的 key,比如填titles,结果就是{"titles": ["iPhone 15", "Samsung S24"]} - 提取属性值(如
<a href="https://x.com">link</a>的链接)时,返回值选Attribute,并在下方填href,不是@href或attr.href
为什么 XPath 比 CSS 选择器更适合多变结构
当你面对不同网站、同一字段却藏在完全不同的 HTML 路径里(比如运费有时在 <div class="price">,有时在 <span data-role="shipping">),CSS 无法用单条规则覆盖:
- XPath 支持联合路径:
(//div[@class="price"] | //span[@data-role="shipping"])[1],用|连接多个可能路径,[1]确保只取首个非空结果 - CSS 选择器只能写
.price, [data-role="shipping"],但它会返回所有匹配项,无法控制“优先用哪个”,容易把错误结构的数据混进来 - 类名动态变化(如
css-abc123)时,XPath 可用contains(@class, "price"),而 CSS 的[class*="price"]在部分解析器(如 jsdom)里不生效 - 注意:n8n HTML 节点**不支持 XPath**,只认 CSS;要用 XPath 得切到 Code 或 Function 节点,配合
lxml或cheerio
真正难的不是写对一条选择器,而是预判 HTML 结构会不会变、JS 会不会改写 DOM、编码会不会乱、空格换行要不要保留——这些细节不提前对齐,跑一次就失效。


















