用R解析网页

一、XML基本语法:

    如果我们用爬网页的方式获取数据,必然要解析网页。网页中存储数据的部分一般用XML语法,所以这里介绍一下R解析XML的方法。其实这部分内容挺简单的,没有高深的技巧,很容易搞明白。  

    首先要知道XML的基本要素:元素、属性、文本数据,我们可以看如下xml文件:

<bookstore>
<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>

   在这个xml里,<bookstore>是根元素,它有两个子元素<book>,第一个<book>元素又有两个子元素分别是<title>和<price>,xml就是这样通过父元素带子元素的形式组成树状结构;其中元素<title>有属性lang,其值eng必须用引号引起来,有文本数据Harry Potter(XML本身就是文本文件),R中有专门的方法可获取该文本数据。元素<price>只有文本数据,无属性。

   XML文件的基本结构如上所述,那么怎么获取这些属性、文本数据呢?这需要用到XPath语法,主要的路径表达式如下:

表达式 描述
/ 从根元素选取
// 选择文档中的元素,而不考虑它们的位置
@ 选取属性

   举几个例子:

路径表达式 结果
 /bookstore

选取根元素bookstore

注意:以“/”开头,表示该路径为绝对路径 

//book  选择所有的book元素,而不考虑它的具体位置 
//@lang  选取所有名为lang的属性 
 /bookstore//price 选择根元素bookstore下所有的price元素 
 /bookstore/book 选择根元素bookstore下所有book子元素 
//title[@lang] 选取所有带属性lang的title元素
//title[@lang="eng"] 选取所有带属性lang且值为eng的title元素

二、R中解析XML的函数:

     R中解析的函数都在XML这个包中,用法如下:

     1)读取xml文件的函数xmlParse:

     如我们将文章开头提到的xml存为books.xml文件,运行如下:     

> library(XML);
> doc = xmlParse('books.xml');
> 
> doc
<?xml version="1.0"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>

    2)获取元素的函数getNodeSet:

> prices = getNodeSet(doc, '/bookstore//price');
> prices
[[1]]
<price>29.99</price>

[[2]]
<price>39.95</price>

attr(,"class")
[1] "XMLNodeSet"

    3)解析元素的文本数据xmlValue:

> xmlValue(prices[[1]])
[1] "29.99"

xmlValue的输入参数类型为XMLNode,如果想一次性获得XMLNodeSet中元素的文本数据,可用如下函数:

> sapply(1:length(prices), function(x) xmlSApply(prices[[x]], xmlValue))
   text    text 
"29.99" "39.95

 三、完整的解析代码如下:

library(XML)
doc = xmlParse('books.xml')
books = getNodeSet(doc, '/bookstore/book')
result = sapply(1:length(books), function(x) xmlSApply(books[[x]], xmlValue))
result = t(result)

langs = getNodeSet(doc, '//@lang')
langs = unlist(langs)
result2 = cbind(result, langs)
result2
View Code

 

posted on 2014-11-19 08:08  michael_YM  阅读(1073)  评论(0编辑  收藏  举报

导航