You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R语言提取HTML中Regeste与Sachverhalt间含标签文本至新列?

问题

我用rvest处理网页,现有一段HTML代码存在数据框中,想要提取包含所有HTML标签的、位于文本"Regeste"和"Sachverhalt"之间的全部内容,并保存到数据框新列里。尝试了以下代码但未成功:

library(tidyverse)

df %>%
 mutate(between = str_extract(content, 'Regeste.*Sachverhalt'))

HTML示例数据:

html <- '<a name="idp341456"></a><div class="big bold">Urteilskopf</div>
<br>147 IV 65<br><br><br><div class="paraatf">8. Auszug aus dem Urteil der Strafrechtlichen Abteilung i.S. A. gegen Generalstaatsanwaltschaft des Kantons Bern, B. und Verein C. (Beschwerde in Strafsachen)</div>
<div class="paraatf">6B_440/2019 vom 18. November 2020</div>
  <a name="idp342784"></a><br><div id="regeste" lang="de">
<div class="big bold">Regeste</div>
<br><div class="paraatf"><span class="artref">Art. 28 Abs. 1 StGB</span>; Strafbarkeit der Medien; keine Anwendbarkeit von <span class="artref">Art. 28 Abs. 1 StGB</span> beim "Teilen" und Kommentieren eines fremden Beitrags auf Facebook.  <div class="paratf">Grundsatz der exklusiven Strafbarkeit des Autors bei Mediendelikten (E. 5.1-5.3). Der in <span class="artref">Art. 28 Abs. 1 StGB</span> verankerte Begriff des "Mediums" umfasst nicht nur sämtliche Kommunikationsträger, sondern auch Kommunikationsmittel (E. 5.4.1-5.4.3). </div>
<div class="paratf">Die Anwendbarkeit von <span class="artref">Art. 28 Abs. 1 StGB</span> erfordert zunächst, dass das Medienerzeugnis der Öffentlichkeit zugänglich gemacht wird. Das gilt grundsätzlich für Beiträge auf Social Media-Plattformen, soweit sie nicht durch persönliche Einstellungen nur für einen beschränkten Personenkreis verfügbar sind (E. 5.4.4). </div>
<div class="paratf">Die Anwendbarkeit von <span class="artref">Art. 28 Abs. 1 StGB</span> bedingt zusätzlich, dass sich die strafbare Handlung in der Veröffentlichung erschöpft. <span class="artref">Art. 28 Abs. 1 StGB</span> privilegiert dabei alle innerhalb der für das Medium typischen Herstellungs- und Verbreitungskette tätigen Personen. Der weite Medienbegriff setzt voraus, dass im Einzelfall geprüft werden muss, wer Teil der medientypischen Kette ist. Vorliegend verneint beim "Teilen" und Kommentieren eines fremden bereits veröffentlichten Beitrags auf Facebook (E. 5.5 und 5.6). </div>
</div>
</div>
  <a name="idp232400"></a>
  <a name="idp246448"></a>
  <br><div>
<a name="idp404656"></a><span class="big bold" id="sachverhalt">Sachverhalt</span> <span class="small">ab Seite 66</span>
</div>
<br><div class="paraatf">'

df <- data.frame(html = html)
解决方案

方法1:修正正则表达式提取

原代码存在两个问题:一是列名错误(数据框列名为html而非content);二是正则未处理换行符,默认.不匹配换行,导致提取不完整。修正后的代码:

library(tidyverse)

df %>%
  mutate(between = str_extract(html, '(?s)Regeste.*?(?=Sachverhalt)'))
  • (?s):开启单行模式,让.匹配包括换行在内的所有字符
  • .*?:非贪婪匹配,确保只提取到第一个"Sachverhalt"之前的内容
  • (?=Sachverhalt):正向预查,不将"Sachverhalt"本身包含在结果中

方法2:用rvest解析HTML结构(更稳定)

既然使用rvest,直接利用HTML结构提取会更可靠,避免正则的局限性:

library(rvest)
library(tidyverse)

df %>%
  mutate(between = map_chr(html, function(x) {
    page <- read_html(x)
    # 直接提取id为regeste的整个节点内容(包含Regeste标题和所有子标签)
    page %>% html_element('#regeste') %>% as.character()
  }))

这种方法依赖HTML的id="regeste"属性定位内容,结构变化时鲁棒性更强,不需要依赖文本匹配。

内容的提问来源于stack exchange,提问作者D. Studer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:43:06