В R, как разобрать конкретный кадр на веб-странице? - PullRequest
2 голосов
/ 23 ноября 2010

Приветствую всех,

Можно ли читать код HTML только с определенного фрейма на веб-странице?

Например, если я отправлю URL-адрес в Google Translate, есть лиспособ разобрать только переведенный фрейм страницы?Всякий раз, когда я пытаюсь, я могу получить доступ только к верхнему фрейму на странице, но не к переведенному фрейму.Вот мой автономный пример кода:

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)

Если кто-нибудь знает о более простомрешение того, что я дал выше, пожалуйста, дайте мне знать!:)

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Для ваших конкретных потребностей перевода, возможно, вам лучше получить доступ к API Google Translate через интерфейс REST, а не соскоб с экрана:

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

2 голосов
/ 23 ноября 2010

Большая часть следующего ответа относится к конкретному случаю Google Translate.В большинстве случаев вам просто нужно проанализировать <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*

Если вы перейдете по ссылке здесь (сначала не забудьте unescape '&'), это даст вам еще один маленькийФрагмент 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, и вам должно стать яснее, что вам нужно делать.

...