提取 HTML 文本中指定起止标记之间的内容(含标签)

1次阅读

提取 HTML 文本中指定起止标记之间的内容(含标签)

本文介绍如何使用 R 语言的 stringr 包精准提取 html 字符串中两个关键词(如 “Regeste” 和 “Sachverhalt”)之间的全部内容(包括中间所有 HTML 标签与空白符),并适配大小写、支持跨行匹配,避免常见正则陷阱。

本文介绍如何使用 r 语言的 `stringr` 包精准提取 html 字符串中两个关键词(如 “regeste” 和 “sachverhalt”)之间的全部内容(包括中间所有 html 标签与空白符),并适配大小写、支持跨行匹配,避免常见正则陷阱。

在网页文本解析(尤其是法律文书、政府公报等结构化 HTML)中,常需按语义区块(如

Regeste

Sachverhalt)提取内容。此时,简单使用 str_extract(html, “Regeste.*Sachverhalt”) 会失败——因为默认点号 . 不匹配换行符,且未排除起始/结束关键词本身,导致结果冗余或截断。

正确做法是使用带环视(lookaround)的正则表达式,配合 [sS]*(匹配任意字符,含换行)实现跨行贪婪匹配,并通过 (?仅包含两关键词之间的原始内容(不含关键词自身)。

以下是完整、健壮的解决方案:

library(dplyr) library(stringr)  # 示例数据(已定义 df$'html') df <- df %>%   mutate(     regeste_content = str_extract(       html,       "(?i)(?<=Regeste|regeste)[sS]*?(?=Sachverhalt|sachverhalt)"     )   )

✅ 关键设计说明:

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

  • (?i):启用不区分大小写模式,兼容 Regeste/regeste 等变体;
  • (?正向后查找(positive lookbehind),确保匹配位置前紧邻任一关键词,但不将其纳入结果;
  • [sS]*?:*? 表示非贪婪匹配(推荐),防止过度捕获到后续多个 Sachverhalt 中的最后一个;[sS] 等价于 (?s:.),可安全匹配换行符、空格、HTML 标签等所有字符;
  • (?=Sachverhalt|sachverhalt):正向先行断言(positive lookahead),确保匹配以任一关键词开头的位置为终点,同样不包含该词本身。

⚠️ 注意事项:

  • 若 HTML 中存在嵌套或重复关键词(如多次出现 Regeste),非贪婪匹配 *? 可保障提取首个 Regeste 到其后最近的 Sachverhalt 之间的内容,符合多数语义需求;
  • 若需严格匹配 HTML 标签边界(例如仅匹配
    Regeste

    后到 Sachverhalt 前),应升级为 xml2::read_html() + CSS/XPath 解析,但本例中纯文本提取已足够高效;

  • str_extract() 返回 NA 当无匹配——建议后续用 if_else(!is.na(regeste_content), regeste_content, “”) 统一空值处理。

最终生成的 regeste_content 列将包含从 Regeste 结束处到 Sachverhalt 开始处之间的完整原始 HTML 片段(含

、换行、缩进等),可直接用于进一步清洗、解析或存档,兼顾准确性与工程实用性。

text=ZqhQzanResources