【问题标题】:Is there a simple way in R to extract only the text elements of an HTML page?R 中是否有一种简单的方法来仅提取 HTML 页面的文本元素?
【发布时间】:2011-03-12 20:26:10
【问题描述】:

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

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

【问题讨论】:

  • @Shane -- 该页面上给出的答案似乎不起作用(至少不再起作用,尽管我确信当时确实如此)。
  • 那我们应该修复它,而不是开始一个新的。或者问一个与旧答案如何不再有效直接相关的问题。
  • @Shane:当我发布我的问题时,我没有看到那个原始问题。我注意到您是在那篇帖子中回答该问题的同一个人,请知道我没有不尊重的意思,当然感谢所有帮助。我认为托尼的以下答案更适合我想做的事情。我是stackoverflow的新手,仍然掌握它的窍门。 :)
  • 不用担心。托尼的回答很棒。只是想确保在您学习 SO 时,在发布之前进行搜索成为日常工作的一部分。回想起来,这些问题有点不同...... :)

标签: html r screen-scraping


【解决方案1】:

我不得不自己做一次。

一种方法是使用 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 表达式适用于所有网页,有时它可能无法过滤掉脚本代码或者它可能根本无法与其他页面一起使用,最好进行实验!)

附:另一种几乎完美的工作方式,我认为在网络上从 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 可能会挂起或崩溃(我不't think ?try 在这种情况下会有很大帮助)。它也容易出现弹出窗口。我不知道,我已经有一段时间没有这样做了,但我想我应该指出这一点。

【讨论】:

  • 很好的答案,虽然我在安装 RTidyHTML 时遇到问题;我试过 install.packages('http://www.omegahat.net/RTidyHTML/RTidyHTML_0.2-1.tar.gz', repos=NULL)install_github('omegahat/RTidyHTML') 但在 Windows 10 上编译失败。
【解决方案2】:

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

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

详情请见https://CRAN.R-project.org/package=htm2txt

【讨论】:

    【解决方案3】:

    好吧,这并不完全是 R 的方式,但它就像它们来的一样简单:outwit plugin for firefox。基本版本是免费的,有助于提取表格和内容。

    啊,如果你真的想在 R 中努力做到这一点,这个link 是给你的:

    【讨论】:

      【解决方案4】:

      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 表格通常包含你不想要的垃圾。

      【讨论】:

        【解决方案5】:

        您也可以使用rvest 包,首先,选择所有包含文本的html节点/标签(例如ph1h2h3),然后从中提取文本:

        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
        

        【讨论】:

          【解决方案6】:

          这是另一种可以使用的方法:

          library(pagedown)
          library(pdftools)
          chrome_print(input = "http://stackoverflow.com/questions/tagged?tagnames=r", 
                       output = "C:/.../test.pdf")
          text <- pdf_text("C:/.../test.pdf")
          

          也可以使用 RSelenium :

          library(RSelenium)
          shell('docker run -d -p 4445:4444 selenium/standalone-firefox')
          remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4445L, browserName = "firefox")
          remDr$open()
          remDr$navigate("http://stackoverflow.com/questions/tagged?tagnames=r")
          remDr$getPageSource()[[1]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-30
            • 1970-01-01
            • 2011-01-02
            • 1970-01-01
            • 2013-06-18
            • 2010-12-25
            • 2021-12-26
            • 2011-04-10
            相关资源
            最近更新 更多