Spider开发流程——开发scrapy常用xpath语法

470 阅读2分钟
表达式
描述
/
选中文档的根节点,或者是描述一个从当前节点开始的绝对路径
.
选中当前节点
..
选中当前节点的父节点
选中当前节点下的所有元素子节点
//
选中当前节点下的所有元素节点,不管是子节点还是孙节点
*
选中所有的元素子节点,不管他们的名称如何
text()
选中所有的文本子节点
@
选中所有标签为的节点
@*
选中所有含有标签的元素
[谓语]
添加特殊的筛选条件
**创建一个response对象,response对象也包含xpath和css方法:**
text="""<html>
... 	<head>
... 		<base href="http://www.baidu.com/">
... 		<meta charset="utf-8">
... 		<title>book Spider example</title>
... 	</head>
... 	<body>
... 		<div id='images'>
... 			<a href="pic1/">图片1<br/><img src="../img/6baa0c32b53eb98abb3d8e40e7444257.jpg" alt="图片丢失"></a>
... 			<br>
... 			<a href="pic2/">图片2<br/><img src="../img/webp.webp" alt="图片丢失"></a>
... 			<br>
... 			<a href="pic3/">图片3<br/><img src="../img/未标题-1.jpg" alt="图片丢失"></a>
... 			<br>
... 			<a href="pic4">图片4<br><img src="../img/背景.jpg" alt="图片丢失"></a>
... 		</div>
... 	</body>
... </html>
... """
response=HtmlResponse(url='www.example',body=text,encoding='utf-8')

/:描述一个绝对路径,用于选中当前绝对路径下的元素

response.xpath('/html')
[<Selector xpath='/html' data='<html>\n\t<head>\n\t\t<base href="http://w...'>]
response.xpath('/html/head')
[<Selector xpath='/html/head' data='<head>\n\t\t<base href="http://www.baidu...'>]

//:选中当前路径下的全部元素

response.xpath('//a').extract()
['<a href="pic1/">图片1<br><img src="../img/6baa0c32b53eb98abb3d8e40e7444257.jpg" alt="图片丢失"></a>', '<a href="pic2/">图片2<br><img src="../img/webp.webp" alt="图片丢失"></a>', '<a href="pic3/">图片3<br><img src="../img/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" alt="图片丢失"></a>', '<a href="pic4">图片4<br><img src="../img/%E8%83%8C%E6%99%AF.jpg" alt="图片丢失"></a>']
text():选中当前绝对路径下的文本标签response.xpath('//a/text()').extract()
['图片1', '图片2', '图片3', '图片4']

:选中所有的元素节点,跟re表达式的的含义相近

response.xpath('/html/body/div/*').extract()
['<a href="pic1/">图片1<br><img src="../img/6baa0c32b53eb98abb3d8e40e7444257.jpg" alt="图片丢失"></a>', '<br>', '<a href="pic2/">图片2<br><img src="../img/webp.webp" alt="图片丢失"></a>', '<br>', '<a href="pic3/">图片3<br><img src="../img/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" alt="图片丢失"></a>', '<br>', '<a href="pic4">图片4<br><img src="../img/%E8%83%8C%E6%99%AF.jpg" alt="图片丢失"></a>']
其实提到了跟re表达式的*相近,我个人理解的xpath跟re有相同的妙处,*就是匹配所有复合条件的元素。因此*可以这样用:
response.xpath('*//a').extract()
['<a href="pic1/">图片1<br><img src="../img/6baa0c32b53eb98abb3d8e40e7444257.jpg" alt="图片丢失"></a>', '<a href="pic2/">图片2<br><img src="../img/webp.webp" alt="图片丢失"></a>', '<a href="pic3/">图片3<br><img src="../img/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" alt="图片丢失"></a>', '<a href="pic4">图片4<br><img src="../img/%E8%83%8C%E6%99%AF.jpg" alt="图片丢失"></a>']

@:标签匹配

Html就是由一个由一个又一个的元素和标签构成的,可以通过元素定位html,同样也可以通过元素的标签进行定位。
response.xpath('*//@href').extract()
['http://www.baidu.com/', 'pic1/', 'pic2/', 'pic3/', 'pic4']

.:描述一个相对路径

这个和“/”的功能相同,但是用法有差异。“/”的作用在于一层一层往下进行索引,但是“.”在于强调从一个selector对象开始进行索引,这个也就是相对的含义。但是如果从根节点开始用“.”进行索引却不行,而且对一个Selector对象进行根索引也不行,所以姑且理解成“/”和根索引挂钩,“.”和Selector对象索引挂钩。
response.xpath('./html')
[]
selector=response.xpath('/html')
selector.xpath('./body')
[<Selector xpath='./body' data='<body>\n\t\t<div id="images">\n\t\t\t<a href...'>]
selector.xpath('/body')
[]
selector_1=response.selector
selector_1.xpath('./html')
[]
selector_1.xpath('/html')
[<Selector xpath='/html' data='<html>\n\t<head>\n\t\t<base href="http://w...'>]
selector_1.xpath('/html').xpath('./body')
[<Selector xpath='./body' data='<body>\n\t\t<div id="images">\n\t\t\t<a href...'>]
selector_1.xpath('/html').xpath('/body')
[]

..:选中当前元素的父元素

son=response.xpath('//a')
son.xpath('..').extract()[0]
'<div id="images">\n\t\t\t<a href="pic1/">图片1<br><img src="../img/6baa0c32b53eb98abb3d8e40e7444257.jpg" alt="图片丢失"></a>\n\t\t\t<br>\n\t\t\t<a href="pic2/">图片2<br><img src="../img/webp.webp" alt="图片丢失"></a>\n\t\t\t<br>\n\t\t\t<a href="pic3/">图片3<br><img src="../img/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" alt="图片丢失"></a>\n\t\t\t<br>\n\t\t\t<a href="pic4">图片4<br><img src="../img/%E8%83%8C%E6%99%AF.jpg" alt="图片丢失"></a>\n\t\t</div>'

[]谓语:添加特定筛选条件

response.xpath('//div/a[@href="pic1/"]').extract()
['<a href="pic1/">图片1<br><img src="../img/6baa0c32b53eb98abb3d8e40e7444257.jpg" alt="图片丢失"></a>']