R中是否有一种简单的方法只能提取HTML页面的文本元素?
我认为这被称为'屏幕抓取',但我没有它的经验,我只需要一种简单的方法来提取您在访问网址时通常在浏览器中看到的文本。
答案 0 :(得分:22)
我必须自己一次这样做。
这样做的一种方法是使用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表达式适用于所有网页,有时它可能不会过滤掉脚本代码或者它可能根本不适用于其他一些页面,最好进行实验!)
P.S。另一种方式,几乎完美的工作,我认为在网页上抓取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可能会挂起或自行崩溃(我不喜欢我认为?在这种情况下尝试帮助那么多)。此外,它很容易允许弹出窗口。我不知道,自从我这么做以来已经有一段时间了,但我想我应该指出这一点。
答案 1 :(得分:3)
这不是一种R方式,但它就像它们来的那样简单:为firefox输出outwit插件。基本版本是免费的,有助于提取表格和内容。
啊,如果你真的想在R中这么做,这个link适合你:
答案 2 :(得分:3)
我很幸运得到了XML包的readHTMLTable()函数。它返回页面上所有表的列表。
> library(XML)
> url <- 'http://en.wikipedia.org/wiki/World_population'
> allTables <- readHTMLTable(url)
每页上可以有很多表格。
> length(allTables)
[1] 17
所以只需选择你想要的那个。
> tbl <- allTables[[3]]
最大的麻烦可能是安装XML包。它很大,它需要libxml2库(在Linux下,它也需要xml2-config Debian软件包)。第二大麻烦是HTML表通常包含你不想要的垃圾,除了你想要的数据。
答案 3 :(得分:3)
最好的解决方案是htm2txt软件包。
library(htm2txt)
url <- 'https://en.wikipedia.org/wiki/Alan_Turing'
text <- gettxt(url)
有关详细信息,请参见https://CRAN.R-project.org/package=htm2txt。
答案 4 :(得分:0)
您还可以使用rvest包,然后首先选择所有包含文本的html节点/标签(例如p
,h1
,h2
,h3
),然后从其中提取文本:
require(rvest)
url = 'https://en.wikipedia.org/wiki/Alan_Turing'
site = read_html(url)
text = html_text(html_nodes(site, 'p,h1,h2,h3')) # comma separate