【问题标题】:Extract data from HTML tags in R从R中的HTML标签中提取数据
【发布时间】:2019-04-04 17:07:38
【问题描述】:

我有一个要从中提取数据的 html 表。我在这里有第 21 行,我需要从中获得 11 个字符向量(然后对所有数据行执行相同操作。我正在尝试编写一个函数来执行此操作,其中:

dt 是我的数据表,这是第 21 行的样子:

[1] "<tr><td>1</td><td>11 Com</td><td>b</td><td>Radial Velocity</td> 
<td>1</td><td>326.03</td><td>1.29</td><td></td><td>19.4</td><td></td> 
<td>2.7</td></tr>"

我需要删除所有“&lt;tr&gt;&lt;td&gt;”等,并在它们背靠背存在的地方插入 0 或 NA ("&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;")。

这是我目前所拥有的。首先,我不断收到错误:

strsplit(a, "&lt;/td&gt;&lt;td&gt;") 中的错误:非字符参数

f<-function(row.data){
 a<-strsplit(row.data,"<tr><td>")
        b<-unlist(strsplit(a,"</td><td>")))
}
f(dt[21])

这还没有解决插入 0 或 NA 的问题。我对 R 很陌生,所以我非常感谢任何帮助。

【问题讨论】:

  • 几件事:你需要在你的正则表达式中用一个额外的斜线来逃避斜线......这很容易变得混乱。还有更合适的从 HTML 标签中提取数据的方法,例如使用rvest,就是为此目的而设计的。另请参阅 this postrvest 答案
  • 另外,rvest 包含一个 html_table 函数,它包含从表中抓取数据所需的多个任务。我猜既然你有&lt;tr&gt; 标签,这是来自网页中的一个更大的表格?从整个表格开始可能会更容易
  • 为什么不使用 HTML 解析器来处理 HTML?

标签: r string split user-defined-functions


【解决方案1】:

这可以通过gsub 完成。正如评论的那样,您确实应该使用\\ 逃避/

dat <-  "<tr><td>1</td><td>11 Com</td><td>b</td><td>Radial Velocity</td><td>1</td><td>326.03</td><td>1.29</td><td></td><td>19.4</td><td></td><td>2.7</td></tr>"
a<-gsub("<tr>",0,dat)
a<-gsub("<td>",0,a) 
a<-gsub("<\\/td>",0,a) 
a<-gsub("<\\/tr>",0,a) 
a
[1] "0010011 Com00b00Radial Velocity0 \n0100326.03001.29000019.4000 \n02.700"

【讨论】:

    【解决方案2】:

    就像我上面提到的,你的任务实际上是解析 HTML,所以更合适的方法是使用像 rvest 这样的包来解析 HTML。我猜这是一个更大的表的一部分,在这种情况下,您可能可以使用rvest::html_table 一次从整个表中抓取数据。

    如果您实际上只是每一行的 HTML 标记字符串,则可以使用 read_html 将该文本转换为其 XML 表示(HTML 的主干)。然后从那个 XML 中,您可以提取 &lt;tr&gt; 标签,然后从 那些 中提取 &lt;td&gt; 标签。我在表格单元格之前做了表格行,以防您需要更多逻辑来将行保持在一起。

    library(dplyr)
    library(rvest)
    
    tags <- "<tr><td>1</td><td>11 Com</td><td>b</td><td>Radial Velocity</td> 
    <td>1</td><td>326.03</td><td>1.29</td><td></td><td>19.4</td><td></td> 
    <td>2.7</td></tr>"
    
    read_html(tags) %>%
      html_nodes("tr") %>%
      html_nodes("td")
    #> {xml_nodeset (11)}
    #>  [1] <td>1</td>\n
    #>  [2] <td>11 Com</td>\n
    #>  [3] <td>b</td>\n
    #>  [4] <td>Radial Velocity</td>
    #>  [5] <td>1</td>\n
    #>  [6] <td>326.03</td>\n
    #>  [7] <td>1.29</td>\n
    #>  [8] <td></td>\n
    #>  [9] <td>19.4</td>\n
    #> [10] <td></td>
    #> [11] <td>2.7</td>
    

    然后html_text从每个标签中拉出内部文本。

    read_html(tags) %>%
      html_nodes("tr") %>%
      html_nodes("td") %>%
      html_text()
    #>  [1] "1"               "11 Com"          "b"              
    #>  [4] "Radial Velocity" "1"               "326.03"         
    #>  [7] "1.29"            ""                "19.4"           
    #> [10] ""                "2.7"
    

    reprex package (v0.2.1) 于 2018 年 10 月 31 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      相关资源
      最近更新 更多