XML与XPath表达式以及R爬虫应用 | R语千寻

Posted 狗熊会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML与XPath表达式以及R爬虫应用 | R语千寻相关的知识,希望对你有一定的参考价值。

XML与XPath表达式以及R爬虫应用 | R语千寻

介绍了html的基本语法和如何在R中用XML包对HTML进行解析。本节将介绍一个跟HTML很相似的内容——XML。


1
XML

相信你第一次看到XML,会有很多问题:什么是XML?有什么用?XML和HTML有什么区别和联系?该如何使用XML?它能给我的工作带来什么好处呢?

XML(eXtensible Markup Language)全称叫做可扩展标记语言,首先它和HTML一样,是一门标记语言,那么它就该有标记语言的全部特征,这是XML的共性。XML当然也有自己的特性,XML是被设计用来传输和存储数据的,这和HTML用来显示数据不大一样,所以XML又有“网络数据交换最流行格式”的美誉。图6-8展示了一段XML代码。

XML与XPath表达式以及R爬虫应用 | R语千寻

图1 XML代码

图1中的XML代码提供了三名NBA球员的一些基本信息。正如之前所提到的,XML首先是一门标记语言,它的语法特性和HTML别无二致。XML里的值和名字都被包裹在有含义的标签中,这三名球员都带有主队、姓名和所在城市信息,这种缩进的框架结构能够让我们轻易地看懂XML文档的架构。文档以根元素<nbaplayer>开始,也以它结束。

XML是一种类似于HTML的标记语言,它的设计宗旨是传输数据,而非显示数据。在编写XML文档时,需要自行定义标签。作为一种纯文本格式,任何有处理纯文本能力的软件都可以拿来处理XML。

下面再简单介绍一下XML的语法规则。XML的语法其实和HTML很像,以图1所示的XML代码为例来说明。

一个XML文档永远以声明该文档属性的一行代码来开头:

<?xml version=”1.0” encoding=”ISO-8859-1”?>

version=”1.0”用来声明该XML文档的版本号,目前就两个版本:1.0和1.1。encoding=”ISO-8859-1”用来声明编码格式。

XML文档必须要有一个根元素,这个根元素包裹了整个文档,在图1所示的例子中,根元素是:

<nbaplayer>

           ...

<\nbaplayer>

XML是用来传输数据的,而这个数据通常是放在具体的XML元素中的。一个XML元素由起始标签和具体内容来定义,一个元素可以用一个闭合标签来结束,也可以在起始标签里用一个斜杠“/”来闭合。元素里可以包含其他元素、属性、具体数据等其他内容。图1所示例子中的<city>元素为:

<city name=”houston” > rockets </city>

它的组成部分有:

元素标题  city

起始标签  <city>

终止标签  </city>

数据值    <rockets>

关于XML还有其他的一些像注释、特殊字符命名、事件驱动等细节知识本书这里就不再展开细说了,感兴趣的朋友可以参考XML官方网站https://www.xml.com/。

2
如何在R语言中解析XML

在R语言中解析XML和解析HTML 是一样的道理,就是对XML原件产生一个能保留住原始文档结构的表征,然后据此从这些文件中提取想要的信息。在R语言中解析XML的过程实际上包括了两个步骤:首先XML文件的符号序列会被读取并从元素中创建层次化的C语言树形数据结构,然后这个数据结构会通过使用处理器翻译为R语言的数据结构。

R中导入和解析XML文档的包就叫XML包,可以使用xmlParse()函数来解析XML。和htmlParse()函数较为类似,输入如下代码:

library(XML)

nbadata <- xmlParse(file="../nbadata.xml")

nbadata

R中XML文档解析结果为:

XML与XPath表达式以及R爬虫应用 | R语千寻

简单的一个函数就可以使得一个完整的XML文档被解析到R中。至于如何提取HTML和XML中我们想要的数据信息,方式有多种,但最方便快捷的恐怕还是XPath表达式。

3
XPath表达式

XPath表达式本质是一种可以查询标记语言的方法。简单来说,XPath表达式就是选取XML或者HTML文件中节点的方法。这里的节点,就是前面提到的XML/HTML文档中的元素。

XPath通过路径表达式(Path Expression)来选择节点信息,跟文件系统路径一样使用“/”符号来分割路径。先来看XPath表达式选择节点的基本规则:

nodename:选择该节点的所有子节点

“/”:选择根节点

“//”:选择任意节点

“@”:选择属性

比如以豆瓣电影中《芳华》的网页为例,尝试在R语言中使用XPath表达式来提取《芳华》这部电影的片名,利用rvest包可以轻松做到。在该网页中,“芳华”这一电影名称和上映时间信息的节点为h1标签下的span标签,那么就可以用“//”符号构建对这两个标签的XPath表达式:

XML与XPath表达式以及R爬虫应用 | R语千寻

基本的XPath表达式的语法内容很多,还有一些诸如通配符、多路径选择等,这里就不展开介绍了。

4
SelectorGadget自动生成XPath表达式

如果你已经看过HTML文件,就会发现,从繁杂的代码中找到需要的信息是非常考验眼力的。比如刚才的《芳华》电影主页,想要定位到导演“冯小刚”并不是一件容易的事。有没有能够把眼前见到的信息定位到HTML代码的方式呢?这里推荐一款Chrome 插件:SelectorGadget。这是一款可以快速定位节点信息的CSS选择器插件,并可以方便快捷地生成网页中想要提取的信息的XPath表达式。简单来说,就是能够“所见即所得”,得到的XPath信息可以直接复制到R爬虫代码中,方便快捷。下面就简单介绍一下它的使用方法。

打开任意一款搜索引擎输入SelectorGadget,选择搜索结果中如图2所示的链接:

XML与XPath表达式以及R爬虫应用 | R语千寻

图2 谷歌搜索SelectorGadget

然后把点开的网页拉到底部,将带有下划线的蓝色字样的SelectorGadget拖拽到浏览器收藏夹(见图3)。

XML与XPath表达式以及R爬虫应用 | R语千寻

图3 SelectorGadget的安装

由此,SelectorGadget选择器就安装完毕了。下次想要使用SelectorGadget来生成XPath表达式时,就可以在收藏夹点击一下它即可完成启动。图6-11展示了NBA官网的情况。

 XML与XPath表达式以及R爬虫应用 | R语千寻

图4 NBA官网:SelectorGadget的使用

假如想定位NBA官网的这个得分表格,则如图4中红色箭头所示,在右下角选择XPath表达式后,网页会自动跳出一个框框,其中的代码就是XPath表达式了。把它复制到代码函数中即可。


XML与XPath表达式以及R爬虫应用 | R语千寻

熊小编1分钟前

第一期:



XML与XPath表达式以及R爬虫应用 | R语千寻



识别下方二维码成为狗熊会会员!

友情提示:

个人会员不提供数据、代码

视频only!

个人会员网址:http://teach.xiong99.com.cn

点击“阅读原文”,成为狗熊会会员!

以上是关于XML与XPath表达式以及R爬虫应用 | R语千寻的主要内容,如果未能解决你的问题,请参考以下文章

数据爬虫:AJAX与网页动态加载 | R语千寻

HTTP协议与R语言爬虫 | R语千寻

跟我学R爬虫|正则表达式与字符处理函数

R语言爬虫系列5|正则表达式与字符串处理函数

R,使用 XML 和 xpathSApply 时的右 xpath 表达式

python--爬虫(XPath与xml类库)