|
本帖最后由 genechip 于 2013-7-29 20:12 编辑
用R读取XML网页数据时,需要受用XPath抓取节点中的信息。如何设置XPath对于新学者 非常重要。
因此搜集一些关于XML中XPath设置方面的介绍
如果把XML看作传统的关系数据库,那么XPath就是SQL。R语言中的XML包可用来解析处理XML或是HTML数据。在之前的文章中,我们了解到readHTMLTable函数,如果页面中的数据是一个规整的表格,用它是很方便的,但如果页面中是一些非结构化的数据,就要用到XML包中的其它函数了。其中最重要两个函数是xmlTreeParse()和getNodeSet(),前者负责抓取页面数据并形成树状结构,后者对抓取的数据根据XPath语法来选取特定的节点集合。下面用一个简单的例子来看一下这两个函数配合使用的效果。
library(XML)
# 解析XML文件
doc <- xmlParse('http://www.w3school.com.cn/example/xmle/books.xml')
# 选取属于 bookstore 子元素的第一个 book 元素
getNodeSet(doc,'/bookstore/book[1]')
# 选取属于 bookstore 子元素的最后一个 book 元素。
getNodeSet(doc,'/bookstore/book[last()]')
# 选取最前面的两个属于 bookstore 元素的子元素的 book 元素
getNodeSet(doc,'/bookstore/book[position()<3]')
# 选取所有拥有名为 lang 的属性的 title 元素。
getNodeSet(doc,'//title[@lang]')
#选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性
getNodeSet(doc,"//title[@lang='eng']")
# 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
getNodeSet(doc,"/bookstore/book[price>35.00]")
# 选取 bookstore 元素中的 book 元素的所有 title 元素,且 price 元素的值须大于 35.00。
getNodeSet(doc,"/bookstore/book[price>35.00]/title")
# 选取 book 元素的所有 title 和 price 元素
getNodeSet(doc,"//book/title | //book/price")
# 选取文档中的所有 title 和 price 元素
getNodeSet(doc,"//title | //price")
# 选取 bookstore 元素的所有子元素
getNodeSet(doc,"/bookstore/*")
# 选取所有带有属性的 title 元素
getNodeSet(doc,"//title[@*]")
# 选择所有属性lang的值
unlist(getNodeSet(doc,"//title/@lang"),use.names = FALSE)
# title结点下的所有文本
getNodeSet(doc,"//title/text()")
|
|