xpath选择器

# encoding: UTF-8

# 从根结点中选取数据                                        /
# 从匹配选择的当前结点选择文档中的结点,不考虑它们的位置        //
# 选取当前结点                                            .
# 选取当前节点的父节点                                    ..
# 选取属性                                               @
# 匹配任何元素节点                                        *
# 匹配任何属性节点                                        @*
# 匹配任何类型的节点                                      Node()

from scrapy.selector import Selector

with open('.superHero.xml','r') as fp:
    body = fp.read()

    print u'全部的数据:'
    print Selector(text=body).xpath('/*').extract()

    print u'采集superHero.xml中第一个class中的birthday中的内容:'
    print Selector(text=body).xpath('/html/body/superhero/class[1]/birthday').extract()

    print u'采集superoHero.xml中最后一个class中的birthday中的内容:'
    print Selector(text=body).xpath('/html/body/superhero/class[last()]/birthday').extract()

    print u'采集superHero.xml 中的到数第二个class中的birthday中的内容:'
    print Selector(text=body).xpath('/html/body/superhero/class[last()-1]/birthday').extract()

    print u'采集superHero.xml 中name属性为en的数据:'
    print Selector(text=body).xpath('/html/body/superhero//name[@lang="en"]').extract()

    print u'采集superHero.xml 中到数第二个class的name结点的文本:'
    print Selector(text=body).xpath('/html/body/superhero/class[last()-1]/name/text()').extract()

    print u'以下是嵌套选择器'
    print u'选取第二class中的name属性的内容:'
    subSector = Selector(text=body).xpath('/html/body/superhero/class').extract()
    print subSector
    # 注, 采用嵌套选择器时,前面有html/body选项
    print Selector(text=subSector[2]).xpath('/html/body/class/name/text()').extract()
    print Selector(text=subSector[2]).xpath('//class/name/text()').extract()

运行结果

全部的数据:
[u'
	
	
		
			Tony Stark 
			Iron Man 
			male 
			1969 
			47 
		
		
			Peter BenJamin Parker 
			Spider Man 
			male 
			unknow 
			unknow 
		
		
			Steven Rogers 
			Caption America 
			male 
			19200704 
			96 
		
		
	
']
采集superHero.xml中第一个class中的birthday中的内容:
[u'1969 ']
采集superoHero.xml中最后一个class中的birthday中的内容:
[u'19200704 ']
采集superHero.xml 中的到数第二个class中的birthday中的内容:
[u'unknow ']
采集superHero.xml 中name属性为en的数据:
[u'Tony Stark ', u'Peter BenJamin Parker ']
采集superHero.xml 中到数第二个class的name结点的文本:
[u'Peter BenJamin Parker ']
以下是嵌套选择器
选取第二class中的name属性的内容:
[u'
			Tony Stark 
			Iron Man 
			male 
			1969 
			47 
		', u'
			Peter BenJamin Parker 
			Spider Man 
			male 
			unknow 
			unknow 
		', u'
			Steven Rogers 
			Caption America 
			male 
			19200704 
			96 
		']
[u'Steven Rogers ']
[u'Steven Rogers ']

superHero.xml

<html>
	<body>
	<superhero>
		<class>
			<name lang="en">Tony Stark </name>
			<alias>Iron Man </alias>
			<sex>male </sex>
			<birthday>1969 </birthday>
			<age>47 </age>
		</class>
		<class>
			<name lang="en">Peter BenJamin Parker </name>
			<alias>Spider Man </alias>
			<sex>male </sex>
			<birthday>unknow </birthday>
			<age>unknow </age>
		</class>
		<class>
			<name lang="ch">Steven Rogers </name>
			<alias>Caption America </alias>
			<sex>male </sex>
			<birthday>19200704 </birthday>
			<age>96 </age>
		</class>
		</superhero>
	</body>
</html>
原文地址:https://www.cnblogs.com/laohaozi/p/12537799.html