【问题标题】:Rvest scraping webpage content returned from html_text()Rvest 抓取从 html_text() 返回的网页内容
【发布时间】:2020-04-24 13:43:58
【问题描述】:

我正在尝试使用 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,null,null,null,null,[[[\"920 NC-16, Crumpler, NC 28617\" ,null,null,null,null,null,null,null,null,null,null,\"Nzm5FTtId895YoaYC4wZqUnMsBJ2rlGI\"]\n,[\"2114 NC-16,牛顿,NC 28658\ ",null,null,null,null,null,null,null,null,null,null,\"RIU-FSdWnM8f-IiOQhDwLoMoaMWYNVGI\"]\n]\n,null,null,0,null,[[null, null,null,null,null,null,null,3]\n,[null,null,null,null,[null,null,null,null,nu"

子字符串很乱但是包含了我需要的内容。我听说使用正则表达式解析网页是不受欢迎的,但我想不出任何其他方式来获取这些内容,这也可以避免使用动态抓取工具。

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

感谢您的宝贵时间。

【问题讨论】:

    标签: r web-scraping html-parsing rvest html-content-extraction


    【解决方案1】:

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

    我不认为用正则表达式解析 specific 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"
    

    【讨论】:

    • 非常感谢,我正在寻找一种更好的方式来浏览 html,并且非常喜欢使用 httr 和 extract() 函数!
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2018-03-20
    • 2020-02-17
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多