• 用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
  • 相关阅读:
    【java】对象赋值给另一个对象
    spring boot系列(五)spring boot 配置spring data jpa (查询方法)
    Spring Data JPA 查询
    Spring Data JPA 介绍
    OpenID简介
    OAUTH协议介绍
    URL encoding(URL编码)
    RESTful 介绍
    spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
    spring boot 启动报 java.lang.NoClassDefFoundError: ch/qos/logback/core/spi/LifeCycle 错误
  • 原文地址:https://www.cnblogs.com/thinkers-dym/p/4090840.html
Copyright © 2020-2023  润新知