2

皆さん、こんにちは。

Web ページ内の特定のフレームからのみ HTML コードを読み取る方法はありますか?

たとえば、Google 翻訳に 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)

私が上に挙げたものに対するより簡単な解決策を誰かが知っているなら、遠慮なく私に知らせてください! :)

4

2 に答える 2

2

次の回答のほとんどは、Google 翻訳の特定のケースに対するものです。ほとんどの場合、<frameset>探しているフレームを解析して取り出すだけで済みますが、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 で試してみると、何をする必要があるかがより明確になるはずです。

于 2010-11-23T16:37:47.037 に答える
2

特定の翻訳が必要な場合は、スクリーン スクレイピングではなく、REST インターフェイス経由で Google 翻訳 API にアクセスする方がよいでしょう。

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

于 2010-11-23T17:46:15.780 に答える