gpt4 book ai didi

R:rvest提取innerHTML

转载 作者:行者123 更新时间:2023-12-02 02:19:04 25 4
gpt4 key购买 nike

使用 R 中的 rvest 来抓取网页,我想从节点中提取相当于 innerHTML 的内容,特别是在应用 html_text 之前将换行符更改为换行符。

所需功能的示例:

library(rvest)
doc <- read_html('<html><p class="pp">First Line<br />Second Line</p>')
innerHTML(doc, ".pp")

应产生以下输出:

[1] "<p class=\"pp\">First Line<br>Second Line</p>"

rvest 0.2 中,这可以通过 toString.XMLNode 实现

# run under rvest 0.2
library(XML)
html('<html><p class="pp">First Line<br />Second Line</p>') %>%
html_node(".pp") %>%
toString.XMLNode
[1] "<p class=\"pp\">First Line<br>Second Line</p>"

对于较新的 rvest 0.2.0.900,此功能不再起作用。

# run under rvest 0.2.0.900
library(XML)
html_node(doc,".pp") %>%
toString.XMLNode
[1] "{xml_node}\n<p>\n[1] <br/>"

所需的功能通常在 xml2 包的 write_xml 函数中提供,rvest 现在依赖于该函数 -如果只有 write_xml 可以将其输出提供给变量而不是坚持写入文件。 (也不接受 textConnection)。

作为解决方法,我可以暂时写入文件:

# extract innerHTML, workaround: write/read to/from temp file
html_innerHTML <- function(x, css, xpath) {
file <- tempfile()
html_node(x,css) %>% write_xml(file)
txt <- readLines(file, warn=FALSE)
unlink(file)
txt
}
html_innerHTML(doc, ".pp")
[1] "<p class=\"pp\">First Line<br>Second Line</p>"

有了这个,我就可以将换行标记转换为换行符:

html_innerHTML(doc, ".pp") %>% 
gsub("<br\\s*/?\\s*>","\n", .) %>%
read_html %>%
html_text
[1] "First Line\nSecond Line"

有没有更好的方法可以使用现有的功能来做到这一点,例如rvestxml2XML 或其他包?我特别想避免写入硬盘。

最佳答案

正如 @r2evans 指出的,as.character(doc)是解决方案。

关于最后一个代码片段,它想要提取 <br> - 转换时将文本从节点中分离出来<br>对于换行符,当前 Unresolved rvest issue #175, comment #2 中有一个解决方法:

此问题的简化版本:

doc <- read_html('<html><p class="pp">First Line<br />Second Line</p>')

# r2evan's solution:
as.character(rvest::html_node(doc, xpath="//p"))
##[1] "<p class=\"pp\">First Line<br>Second Line</p>"

# rentrop@github's solution, simplified:
innerHTML <- function(x, trim = FALSE, collapse = "\n"){
paste(xml2::xml_find_all(x, ".//text()"), collapse = collapse)
}
innerHTML(doc)
## [1] "First Line\nSecond Line"

关于R:rvest提取innerHTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com