R中是否有一种简单的方法来只提取HTML页面的文本元素?

Jos*_*ove 22 html screen-scraping r

R中是否有一种简单的方法来只提取HTML页面的文本元素?

我认为这被称为"屏幕抓取",但我没有它的经验,我只需要一种简单的方法来提取您在访问网址时通常在浏览器中看到的文本.

Ton*_*yal 23

我必须自己一次这样做.

一种方法是使用XPath表达式.您将需要从http://www.omegahat.org/的存储库安装这些软件包.

library(RCurl)
library(RTidyHTML)
library(XML)
Run Code Online (Sandbox Code Playgroud)

我们使用RCurl连接到感兴趣的网站.它有很多选项,允许您访问基础R中的默认功能会有困难的网站,我认为这是公平的说法.它是libcurl库的R接口.

我们使用RTidyHTML来清理格式错误的HTML网页,以便更容易解析.它是libtidy库的R接口.

我们使用XML来使用XPath表达式解析HTML代码.它是libxml2库的R接口.

无论如何,这是你做的(最小代码,但选项可用,请参阅相应功能的帮助页面):

u <- "http://stackoverflow.com/questions/tagged?tagnames=r" 
doc.raw <- getURL(u)
doc <- tidyHTML(doc.raw)
html <- htmlTreeParse(doc, useInternal = TRUE)
txt <- xpathApply(html, "//body//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]", xmlValue)
cat(unlist(txt))
Run Code Online (Sandbox Code Playgroud)

这种方法可能存在一些问题,但我不记得它们是什么问题(我不认为我的xpath表达式适用于所有网页,有时它可能不会过滤掉脚本代码或者它可能简单的是根本不与其他一些页面一起工作,最好进行实验!)

PS另一种方式,几乎完美的工作我认为在网页上抓取来自html的所有文本如下(基本上让Internet Explorer为你做转换):

library(RDCOMClient) 
u <- "http://stackoverflow.com/questions/tagged?tagnames=r"
ie <- COMCreate("InternetExplorer.Application") 
ie$Navigate(u)
txt <- list()
txt[[u]] <- ie[["document"]][["body"]][["innerText"]] 
ie$Quit() 
print(txt) 
Run Code Online (Sandbox Code Playgroud)

但是,我从来不喜欢这样做,因为它不仅速度慢,而且如果你矢量化它并应用一个URL矢量,如果Internet Explorer在一个坏页面崩溃,那么R可能会挂起或崩溃(我不认为?在这种情况下尝试帮助那么多).此外,它很容易允许弹出窗口.我不知道,自从我做完这件事已经有一段时间了,但我想我应该指出这一点.


小智 9

最好的解决方案是包 htm2txt。

library(htm2txt)
url <- 'https://en.wikipedia.org/wiki/Alan_Turing'
text <- gettxt(url)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅https://CRAN.R-project.org/package=htm2txt