如何将html列表转换为r中的数据框?

时间:2014-07-25 14:49:55

标签: r web-scraping

我需要将HTML转换为数据框中的值。

例如这段html:

<div class="header">
<h3>title 1</h3>
</div>
<div class="content">
<ul>
<li>info1</li>
<li>info2
</li>
<li>info3
</li>
</ul>
</div>
<div class="header">
<h2>title 2</h2>
</div>
<div class="content">
<ul>
<li>info4</li>
<li>info5
</li>
<li>info6
</li>
</ul>
</div>

我希望将其更改为数据框,如:

    Title  Info
1 title 1 info1
2 title 1 info2
3 title 1 info3
4 title 2 info4
5 title 2 info5
6 title 2 info6

我尝试了XML包和tm.plugin.webmining包中的函数。我也试过了这个页面上提到的代码:http://tonybreyal.wordpress.com/2011/11/18/htmltotext-extracting-text-from-html-via-xpath/ 到目前为止,我还没有成功找到能满足我想要的功能。有没有人知道如何处理这个问题?

1 个答案:

答案 0 :(得分:3)

我认为XML库中的HTML解析会对此有所帮助。我们假设您上面显示的HTML输入存储在名为intext的变量中。然后我们可以使用

处理您的数据
library(XML)
hh <- htmlParse(intext, asText=T)

#use xpath to extract data
titles <- xpathSApply(hh, "//div[@class='header']/*/text()", xmlValue)
info <- xpathApply(hh, "//div[@class='content']/ul", function(x) 
    gsub("\\s+","",xpathSApply(x,"./li/text()", xmlValue)))

#merge results together
do.call(rbind, Map(cbind, titles, info))

返回

     [,1]      [,2]   
[1,] "title 1" "info1"
[2,] "title 1" "info2"
[3,] "title 1" "info3"
[4,] "title 2" "info4"
[5,] "title 2" "info5"
[6,] "title 2" "info6"

这是一个矩阵,如果你愿意,你可以很容易地变成data.frame。