【问题标题】:scraping with R用R刮
【发布时间】:2014-06-25 03:56:57
【问题描述】:

我有这个 html 文件

<html>

<table width="111" >

  <tr>  <td> A </td>
        <td> B </td>
  </tr>
  <tr>  <td> C </td>
        <td> D </td>
  </tr>

</table> 

<table width="222" >

  <tr>  <td> E </td>
        <td> F </td>
  </tr>
  <tr>  <td> G </td>
        <td> H </td>
  </tr>

</table> 
</html>

R我正在做

library(XML)
tree = htmlTreeParse(file, useInternal=TRUE, asTree=TRUE)
table = getNodeSet(tree, "//table[@width='222']")[[1]]
xpathSApply(table, "//td", xmlValue)

我得到了

[1] " A " " B " " C " " D " " E " " F " " G " " H "

而我却想得到

[1]  " E " " F " " G " " H "

我不明白发生了什么

【问题讨论】:

    标签: html xml r html-parsing


    【解决方案1】:

    就那样做吧:

    # Load libraries
    library(XML)
    
    # Load data
    base_html <- "<html><table width='111'><tr><td>A</td><td>B</td></tr><tr><td>C</td><td>D</td></tr></table><table width='222'><tr><td>E</td><td>F</td></tr><tr><td>G</td><td>H</td></tr></table></html>"
    
    # Parse HTML
    tree  <-  htmlTreeParse(base_html, useInternal=TRUE, asTree=TRUE)
    
    # Get data
    xpathSApply(tree, "//table[@width='222']/tr/td", xmlValue)
    

    【讨论】:

    • 三个简单的问题:(i) 为什么你的答案需要 RCurl? (ii) 是tree 还是table.temp? (iii) 关于为什么我正在做的事情不起作用的任何见解?谢谢。
    • 你是对的。抱歉,我草率地发布了代码。这是玩弄的人工制品。我更正了代码。
    • 关于您的第三个问题:您可以使用您最初的方法,但是,您必须将 XPath 语句更改为 xpathApply(table, "*/td", xmlValue)。在这种情况下,您对“//”的使用不正确。有关更多信息,请参见例如bennadel.com/blog/…
    • @djas:这对你有帮助吗?
    【解决方案2】:

    使用您当前的方法,您可以使用此方法获取值。顺便说一句,您可能不想将名称 table 分配给任何东西,因为它是一个基本的 R 函数,可能会导致麻烦。也不需要Rcurl

    > library(XML)
    > doc <- '<html>
      <table width="111" >
        <tr>  <td> A </td>
              <td> B </td>
        </tr>
        <tr>  <td> C </td>
              <td> D </td>
        </tr>
      </table> 
      <table width="222" >
        <tr>  <td> E </td>
              <td> F </td>
        </tr>
        <tr>  <td> G </td>
              <td> H </td>
        </tr>
      </table> 
      </html>'
    > tree <- htmlTreeParse(doc, useInternal = TRUE, asTree = TRUE)
    > tab <- getNodeSet(tree, "//table[@ width='222']")[[1]]
    > xpathSApply(tab, "//table[@width='222']/tr/td", xmlValue)
    [1] " E " " F " " G " " H "
    

    或者,你可以这样做

    > tab2 <- getNodeSet(tree, "//table")[[2]]
    > xpathSApply(tab2, "//table[@width='222']/tr/td", xmlValue)
    [1] " E " " F " " G " " H "
    

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多