【问题标题】:In R, how to parse specific frame within a webpage?在 R 中,如何解析网页中的特定框架?
【发布时间】:2010-11-23 16:15:40
【问题描述】:

大家好,

有没有办法只从网页中的特定框架读取 HTML 代码?

例如,如果我向谷歌翻译提交一个 url,有没有办法只解析翻译后的页面框架?每当我尝试时,我只能访问页面上的顶部框架,而不能访问已翻译的框架。这是我的独立示例代码:

library(XML)
url <- "http://www.baidu.com/s?wd=r+project"
url.google.translate <- URLencode(paste("http://translate.google.com/translate?js=y&prev=_t&hl=en&ie=UTF-8&layout=1&eotf=1&sl=zh-CN&tl=en&u=", url, sep=""))
htmlTreeParse(url.google.translate, useInternalNodes = FALSE)

以上代码引用了这个url:

$file
[1] "http://translate.google.com/translate?js=y&prev=_t&hl=en&ie=UTF-8&layout=1&eotf=1&sl=zh-CN&tl=en&u=http://www.baidu.com/s?wd=r+project"

但是输出只访问页面的顶部框架而不是主框架,这是我感兴趣的。

希望这是有道理的,并在此先感谢您的帮助。

托尼

更新 - 感谢下面@kwantam 的回答(已接受),我能够使用它来获得如下解决方案(自包含):

> # Load R packages
> library(RCurl)
> library(XML)
> 
> # STAGE 1 - find forward url in relevent frame
> ( url <- "http://www.baidu.com/s?wd=r+project" )
[1] "http://www.baidu.com/s?wd=r+project"
> gt.url <- URLencode(paste("http://translate.google.com/translate?js=y&prev=_t&hl=en&ie=UTF-8&layout=1&eotf=1&sl=zh-CN&tl=en&u=", url, sep=""))
> gt.doc <- getURL(gt.url)
> gt.html <- htmlTreeParse(gt.doc, useInternalNodes = TRUE, error=function(...){})
> nodes <- getNodeSet(gt.html, '//frameset//frame[@name="c"]')
> gt.parameters <- sapply(nodes, function(x) x <- xmlAttrs(x)[[1]])
> gt.url <- paste("http://translate.google.com", gt.parameters, sep = "")
> 
> # STAGE 2 - find forward url to translated page
> doc <- getURL(gt.url, followlocation = TRUE)
> html <- htmlTreeParse(doc, useInternalNodes = TRUE, error=function(...){})
> url.trans <- capture.output(getNodeSet(html, '//meta[@http-equiv="refresh"]')[[1]])
> url.trans <- strsplit(url.trans, "URL=", fixed = TRUE)[[1]][2]
> url.trans <- gsub("\"/>", "", url.trans, fixed = TRUE)
> url.trans <- xmlValue(getNodeSet(htmlParse(url.trans, asText = TRUE), "//p")[[1]])
> 
> # STAGE 3 - load translated page
> url.trans
[1] "http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF-8&sl=zh-CN&tl=en&u=http://www.baidu.com/s%3Fwd%3Dr%2520project&prev=_t&rurl=translate.google.com&usg=ALkJrhiCMu1mKv-czCmEaB7PO925TJCa-A "
> #getURL(url.trans)

如果有人知道我上面给出的更简单的解决方案,请随时告诉我! :)

【问题讨论】:

  • 您需要“url”而不是“u”作为粘贴的第二个参数
  • @mdsumner 好地方,现在已经修好了。我应该在新的 R 会话中测试该代码(当前会话中已经有一个名为“u”的变量,因此没有错误)

标签: r google-translate


【解决方案1】:

以下大部分答案是针对谷歌翻译的特殊情况。在大多数情况下,您只需要解析 &lt;frameset&gt; 并拉出您要查找的任何帧,尽管它可能不会立即明显看出哪一个是 HTML 中的主要帧(也许看看相对大小的帧)。

看来您必须进行几次刷新才能获得实际内容。特别是,当您抓取刚才提到的 URL 时,您会看到类似

  *snip*
<noframes>
<script>
<!--document.location="/translate_p?hl=en&amp;ie=UTF-8&amp;sl=zh-CN&amp;tl=en&amp;u=http://www.baidu.com/s%3Fwd%3Dr%2520project&amp;prev=_t&amp;usg=asdf";-->
</script>
<a href="/translate_p?hl=en&amp;ie=UTF-8&amp;sl=zh-CN&amp;tl=en&amp;u=http://www.baidu.com/s%3Fwd%3Dr%2520project&amp;prev=_t&amp;usg=asdf">Translate
</a>
</noframes>
  *snip*

如果您点击此处的链接(记得先取消转义 '&'),它会给您另一个小的 HTML 片段,其中包括

<meta http-equiv="refresh" content="0;URL=http://translate.googleusercontent.com/translate_c?hl=en&amp;ie=UTF-8&amp;sl=zh-CN&amp;tl=en&amp;u=http://www.baidu.com/s%3Fwd%3Dr%2520project&amp;prev=_t&amp;rurl=translate.google.com&amp;usg=asdf">

再次,取消转义“&”,然后在刷新后,您将获得您正在寻找的翻译页面。

在 wget 或 curl 中使用它,应该会更清楚你需要做什么。

【讨论】:

    【解决方案2】:

    对于您的特定翻译需求,也许您最好通过 REST 接口访问谷歌翻译 API,而不是屏幕抓取:

    http://code.google.com/apis/language/translate/overview.html

    【讨论】:

    • 我对访问框架的通用方式更感兴趣,但非常感谢您提供的网络链接,它肯定会对我正在做的其他事情有用。
    猜你喜欢
    • 2018-04-18
    • 2018-08-20
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多