问候所有人,
有没有办法只从网页中的特定框架中读取HTML代码?
例如,如果我向Google翻译提交网址,是否有办法解析翻译的网页框架?每当我尝试时,我只能访问页面上的顶部框架而不能访问翻译的框架。这是我自包含的示例代码:
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)
以上代码引用此网址:
$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)
如果有人知道我上面给出的更简单的解决方案,请随时告诉我! :) 的
答案 0 :(得分:2)
以下大部分答案都适用于Google翻译的特定情况。在大多数情况下,你只需要解析<frameset>
并拉出你正在寻找的任何一个框架,虽然它可能不是很明显哪个是HTML中的主要框架(也许看看相对尺寸)的框架)。
看起来您将需要进行一些刷新才能获得实际内容。特别是,当你抓住刚刚提到的网址时,你会看到类似
的内容 *snip*
<noframes>
<script>
<!--document.location="/translate_p?hl=en&ie=UTF-8&sl=zh-CN&tl=en&u=http://www.baidu.com/s%3Fwd%3Dr%2520project&prev=_t&usg=asdf";-->
</script>
<a href="/translate_p?hl=en&ie=UTF-8&sl=zh-CN&tl=en&u=http://www.baidu.com/s%3Fwd%3Dr%2520project&prev=_t&usg=asdf">Translate
</a>
</noframes>
*snip*
如果您点击此处的链接(请记得首先是unescape'&amp;'),它会为您提供另一个小HTML片段,其中包含
<meta http-equiv="refresh" content="0;URL=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=asdf">
再次,unescaping'&amp;'然后在刷新之后,您将拥有您正在寻找的翻译页面。
在wget或curl中玩这个,你应该更清楚你需要做什么。
答案 1 :(得分:2)
对于您的特定翻译需求,也许您最好通过REST界面访问Google翻译API,而不是屏幕抓取:
http://code.google.com/apis/language/translate/overview.html