r语言 - Rvest 抓取从 html_text() 返回的网页内容



我正在尝试使用 rvest 包从网页中抓取(动态?(内容。我知道动态内容应该需要使用Selenium或PhantomJS等工具。

然而,我的实验让我相信我仍然应该能够找到我想要的内容,只使用标准的网络抓取r包(rvest,httr,xml2(。

对于这个例子,我将使用谷歌地图网页。 这是示例网址...

https://www.google.com/maps/dir/920+nc-16-br,+denver,+nc,+28037/2114+hwy+16,+denver,+nc,+28037/

如果您按照上面的超链接进行操作,它将带您进入示例网页。在这个例子中,我想要的内容是网页左上角的地址"920 NC-16, Crumpler, NC 28617"和"2114 NC-16, Newton, NC 28658"。

使用 css 选择器或 xpath 的标准技术不起作用,这最初是有道理的,因为我认为这些内容是动态的。

url<-"https://www.google.com/maps/dir/920+nc-16-br,+denver,+nc,+28037/2114+hwy+16,+denver,+nc,+28037/"
page<-read_html(url)
# The commands below all return {xml nodeset 0}
html_nodes(page,css=".tactile-searchbox-input")
html_nodes(page,css="#sb_ifc50 > input")
html_nodes(page,xpath='//*[contains(concat( " ", @class, " " ), concat( " ", "tactile-searchbox-input", " " ))]')

上面的命令都返回"{xml nodeset 0}",我认为这是动态生成此内容的结果,但这是我的困惑谎言,如果我使用 html_text(( 将整个页面转换为文本,我可以在返回的值中找到地址。

html_text(read_html(url))
substring<-substr(x,33561-100,33561+300)

执行上述命令会生成具有以下值的子字符串,

"null,null,null,null,[null,null,null,[[\">920 NC-16, Crumpler, NC 28617\",null,null,null,Nzm5FTtId895YoaYC4wZqUnMsBJ2rlGI\"],[\"2114 NC-16,Newton, NC 28658\",null,\"RIU-FSdWnM8f-IiOQhDwLoMoaMWYNVGI\"]],null,null,0,null,[[null,null,null,null,3]

,[null,null,null,null,[null,null,null,null,nu"子字符串非常混乱,但包含我需要的内容。我听说使用正则表达式解析网页是不受欢迎的,但我想不出任何其他方法来获取此内容,这也将避免使用动态抓取工具。

如果有人对解析返回的 html 有任何建议,或者可以解释为什么我无法使用 xpath 或 css 选择器找到内容,但可以通过简单地解析原始 html 文本来找到它,我们将不胜感激。

谢谢你的时间。

使用 Xpath 或 css 选择器找不到文本的原因是您找到的字符串位于 javascript 数组对象的内容中。您假设您可以在屏幕上看到的文本元素是动态加载的是正确的;这些不是您从中读取字符串的地方。

我认为使用正则表达式解析特定的html 没有任何问题。我会确保我得到完整的 html 而不仅仅是html_text()输出,在这种情况下使用httr包。您可以从页面中获取地址,如下所示:

library(httr)
GetAddressFromGoogleMaps <- function(url)
{
GET(url)                %>% 
content("text")         %>%
strsplit("spotlight")   %>%
extract2(1)             %>%
extract(-1)             %>%
strsplit("[[]{3}(")*") %>%
extract2(1)             %>%
extract(2)              %>%
strsplit(""")          %>%
extract2(1)             %>%
extract(1)
}

现在:

GetAddressFromGoogleMaps(url)
#[1] "920 NC-16, Crumpler, NC 28617, USA"

最新更新