【发布时间】: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