从 html 中提取 <h2> 标题文本,其中标题文本可能包含换行符

问题描述 投票:0回答:2

我有一个 html 文件,其中包含一些

<h2>
标签,例如

a <- '<section id="sec-standard-stoet-geary" class="level2" data-number="9.4">
      <h2 data-number="9.4" class="anchored" data-anchor-id="sec-standard-stoet-geary">
      <span class="header-section-number">9.4</span> Standardising PISA results</h2>'

b <- '</span> <span class="fu">read_parquet</span>(<span 
     class="st">"&lt;folder&gt;PISA_2015_student_subset.parquet"</span>)</span></code><button 
     title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre> 
     </div>
     </div>
     </section><section id="sec-leftjoin" class="level2" data-number="9.3"><h2 data-number="9.3" 
     class="anchored" data-anchor-id="sec-leftjoin">
     <span class="header-section-number">9.3</span> Linking data using <code>left_join</code>
     </h2>
     <p>'

我可以使用以下方法提取

a
的标题:

str_extract_all(a, '(?<=(<[/]span>)).*(?=(<[/]h))')[[1]] %>% str_squish()
> [1] "Standardising PISA results"

但是在

b
上尝试这个不会返回任何结果:

str_extract_all(b, '(?<=(<[/]span>)).*(?=(<[/]h))')[[1]] %>% str_squish()
> character(0)

编辑:从评论来看,这似乎是正则表达式无法解析换行符。

我尝试在正则表达式

(?s)
中启用单行模式进行解析,但它仍然不起作用

r regex
2个回答
3
投票

我会在这里使用 html 解析器而不是正则表达式:

library(rvest)

read_html(a) |> html_elements("h2") |> html_text() |> trimws()
#> [1] "9.4 Standardising PISA results"

read_html(b) |> html_elements("h2") |> html_text() |> trimws()
#> [1] "9.3 Linking data using left_join"

0
投票

这是一个辅助函数,它将选择具有跨度的 H2 元素,但会忽略跨度

library(xml2)
geth2 <- function(x) {
  temp <- read_html(x) %>% xml_find_all("//h2[span]")
  xml_remove(xml_find_all(temp, ".//span"))
  temp %>% xml_text() %>% stringr::str_squish()  
}

geth2(a)
# [1] "Standardising PISA results"
geth2(b)
# [1] "Linking data using left_join"
© www.soinside.com 2019 - 2024. All rights reserved.