|
表达式
|
描述
|
|
/
|
选中文档的根节点,或者是描述一个从当前节点开始的绝对路径
|
|
.
|
选中当前节点
|
|
..
|
选中当前节点的父节点
|
|
选中当前节点下的所有元素子节点
| |
|
//
|
选中当前节点下的所有元素节点,不管是子节点还是孙节点
|
|
*
|
选中所有的元素子节点,不管他们的名称如何
|
|
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>']