我有一个 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">"<folder>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)
中启用单行模式进行解析,但它仍然不起作用
我会在这里使用 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"
这是一个辅助函数,它将选择具有跨度的 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"