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

新手上路,请多包涵

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

我认为这被称为“屏幕抓取”,但我没有这方面的经验,我只需要一种简单的方法来提取您在访问 url 时通常会在浏览器中看到的文本。

原文由 JoshuaCrove 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 319
2 个回答

我不得不自己做一次。

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

library(RCurl)
library(RTidyHTML)
library(XML)

我们使用 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))

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

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)

但是,我从来都不喜欢这样做,因为它不仅速度慢,而且如果你对其进行矢量化并应用 URL 向量,如果 Internet Explorer 在错误页面上崩溃,那么 R 可能会挂起或崩溃(我不认为?try 在这种情况下有很大帮助)。它也容易允许弹出窗口。我不知道,自从我这样做以来已经有一段时间了,但我认为我应该指出这一点。

原文由 Tony Breyal 发布,翻译遵循 CC BY-SA 3.0 许可协议

最好的解决方案是打包 htm2txt。

 library(htm2txt)
url <- 'https://en.wikipedia.org/wiki/Alan_Turing'
text <- gettxt(url)

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

原文由 guest 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题