zoukankan      html  css  js  c++  java
  • 用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
  • 相关阅读:
    Angular5的new feature
    Angular集成UEditor
    Angular集成admin-lte框架
    Angular TypeScript开发环境集成jQuery扩展插件
    如何在 Docker 容器中运行 Kali Linux 2.0
    信息系统安全等级保护基本要求
    Angular学习笔记
    Ubuntu16.04部署phantomjs的一个问题
    仿探探卡片滑动vue封装并发布到npm
    使用vscode,新建.vue文件,tab自动生成vue代码模板
  • 原文地址:https://www.cnblogs.com/thinkers-dym/p/4090840.html
Copyright © 2011-2022 走看看