在R中,如何解析网页中的特定框架?

2024-02-15

大家好,

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

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

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"

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

希望这是有道理的,并提前感谢您的帮助。

Tony

更新 - 感谢下面@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)

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


以下大部分答案是针对谷歌翻译的特定情况。在大多数情况下,您只需要解析<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 中尝试一下,你应该会更清楚你需要做什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在R中,如何解析网页中的特定框架? 的相关文章

  • R中不重复的组合

    我试图获取变量元素长度为 3 的所有可能组合 虽然它部分地与combn 一起工作 但我没有完全得到我正在寻找的输出 这是我的例子 x lt c a b c d e t combn c x x 3 我得到的输出看起来像这样 1 2 3 1 a
  • 在 R 的 stargazer 表中设置注释格式

    我在用stargazer包来生成 回归输出 表 一切都在奇迹般地进行 直到我开始编辑笔记 First 换行很难 但是 Bryansuggests https stackoverflow com questions 21720264 star
  • jQuery翻译+切换,如何链接两者?

    我目前正在开发一个 jQuery 脚本 它将把网站的文本翻译成外语 我正在为此使用 Google Translate API 我希望该页面包含一个显示 En Espanol 的链接 当用户单击 En Espanol 时 页面正文会被翻译成西
  • 在函数中调用其他列的控制流程

    我正在尝试在给定条件的情况下连接到函数中的其他列 本质上 我想让数据框在给定条件的情况下从长到宽 其中一列中的这些值是NA相对于同一行中具有值的另一列 转动NAs转化为特定的数字 尽管分配的值必须是特定于列的 因此 如果2010 has N
  • rle 命令帮助

    我在使用 rle 命令时遇到了一些麻烦 该命令旨在找到参与者连续达到 8 个连续参与者的点 例如 如果 x lt c 0 1 0 1 1 1 1 1 1 1 1 1 我想返回值 11 感谢 DWin 我一直在使用这段代码 which rle
  • 在 R 中,如何让 PRNG 在平台之间给出相同的浮点数?

    在 R 4 1 1 中运行以下代码会在平台之间产生不同的结果 set seed 1 x lt rnorm 3 3 print x 22 0 83562861241004716 intel windows 0 8356286124100471
  • 在 R 中按邮政编码绘制美国地图上的点,并插入阿拉斯加和夏威夷

    我正在尝试以密度点格式在美国地图上绘制点 其中每个邮政编码的点的大小根据该邮政编码中从事某种职业的人数而定 我已经非常接近我需要的东西 但正在努力获取阿拉斯加和夏威夷的坐标 它们需要在插图上 这里的第一组代码是我所拥有的 loc full2
  • 我们如何获取R中的商品价格?

    正如标题 我知道我们可以使用quantmod包来获取股票价格 但我们如何检索黄金 石油或农产品等商品价格 Use Quandl包 这里有一些例子 Gold lt Quandl LBMA GOLD WTI lt Quandl CHRIS CM
  • ggplot多个时间不等的时间序列

    我知道有一些与时间序列和多个数据帧相关的已回答问题 但我似乎无法弄清楚这一点 我想绘制 4 个不同压力传感器与时间的时间戳数据 pa 列 我有来自同一实验的 4 个带时间戳的压力读数 dfs 然而 由于传感器故障和数据中的其他信号 传感器收
  • R:如何在不耗尽内存的情况下重新绑定两个巨大的数据帧

    我有两个数据框df1 and df2每个都有大约 1000 万行和 4 列 我使用 RODBC sqlQuery 将它们读入 R 没有任何问题 但是当我尝试rbind他们 我收到了最可怕的 R 错误消息 cannot allocate me
  • 基于 dplyr 中的向量创建新列

    With dplyr使用以下命令可以轻松创建新列mutate df lt data frame v1 1 3 v2 c a b c gt mutate df newcol NA v1 v2 newcol 1 1 a NA 2 2 b NA
  • 包含多行 LaTeX 方程的 R 帮助页面

    我正在编写 R 包文档roxygen2 我想将以下多行方程插入到帮助页面中 但我的 LaTeX 代码没有被渲染 hello2 description deqn F t begin cases alpha t f L t 1 alpha t
  • R 中 bquote 中的拼接

    假设我正在使用 R 的反引号运算符构建一个表达式bquote 并且我想在列表中的特定位置 拼接 即丢失列表的外括号 例如 我有表达式 5 4 我想在其开头添加 6 而不使用字符串操作 即完全对符号结构进行操作 So gt b quote 5
  • 如何在 ifelse 中使用示例

    我有以下清单 x rep a 100 如果我使用下表 ifelse x a sample c 1 100 1 0 当我第一次运行时 我得到以下输出 1 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
  • 如何定义 Flexdashboard 上社交网络图标的链接?

    我向 Flexdashboard 的导航栏添加了社交图标 但无法为每个图标添加适当的链接 在 R Markdown 文件中 我添加了 output flexdashboard flex dashboard social twitter fa
  • scale_y_discrete 忽略中断/标签

    漏洞 可能相关对此 https github com tidyverse ggplot2 issues 1589 dat data frame x 1 4 y ordered c 4 gt 5 1 1 levels c 1 5 gt 5 g
  • R:动态创建变量名

    我正在寻找使用 for 循环创建多个数据帧 然后将它们缝合在一起merge 我可以使用创建我的数据框assign paste blah 但是 在同一个 for 循环中 我需要删除每个数据帧的第一列 这是我的代码的相关部分 for j in
  • Predict.randomForest 中的错误

    我希望有人能够帮助我解决 R 中 randomForest 包的预测函数遇到的问题 当我尝试预测测试数据时 我不断收到相同的错误 到目前为止 这是我的代码 extractFeatures lt function RCdata feature
  • 如何通过 R 的 cor() 的相关分析计算 P 值和标准误差

    I have data http dpaste com 1064360 plain 其中包含每个条件 x 和 y 的 54 个样本 我通过以下方式计算了相关性 gt dat lt read table http dpaste com 106
  • 如何为ggplot中的每个方面行添加y轴标题?

    我正在做一个散点图facet grid 像那样 library ggplot2 ggplot df aes x y geom point facet grid group1 group2 我想要 y 轴标题y像这样位于每一行的中间 绘制解决

随机推荐