首页 > 解决方案 > rvest 疑难解答

问题描述

我有以下html字符串:

html <- '<head>
    <dd>
        "Line 1 : abc
        Line 2 : def
        Line 3 : ghi
        Line 4 : jkl
        Line 5 : mno"
    </dd>
</head>'

如果我想提取 < dd > 标签之间的所有内容,那么我可以毫无问题地使用 XML 或 rvest 包:

library(tidyverse)
library(XML)

xpath <- '//dd'

html %>% 
    XML::htmlParse(., asText=TRUE) %>% 
    XML::xpathSApply(., path = xpath, xmlValue)


html %>% 
    xml2::read_html() %>%
    rvest::html_nodes(xpath=xpath) %>%
    rvest::html_text()

这会产生:

'\n        "Line 1 : abc\n        Line 2 : def\n        Line 3 : ghi\n        Line 4 : jkl\n        Line 5 : mno"\n    '
'\n        "Line 1 : abc\n        Line 2 : def\n        Line 3 : ghi\n        Line 4 : jkl\n        Line 5 : mno"\n    '

但我只想从第 4 行中提取文本。所以我更新了我的 Xpath 并保持其余代码相同:

xpath <- 'substring-after(substring-after(substring-before(//dd, "Line 5"), "Line 3"), "\n")'

html %>% 
    XML::htmlParse(., asText=TRUE) %>% 
    XML::xpathSApply(., path = xpath, xmlValue)


html %>% 
    xml2::read_html() %>%
    rvest::html_nodes(xpath=xpath) %>%
    rvest::html_text()

这一次 XML 有效,但 rvest 无效:

'        Line 4 : jkl\n        '
Error in nodes_duplicated(nodes): Expecting an external pointer: [type=character].

如何使用 rvest 获得“第 4 行:jkl\n”的预期结果?

标签: rxmlrvest

解决方案


推荐阅读