爬虫之xpath表达式

说明

总结自己在爬虫过程中遇到的xpath表达式用法

在爬虫解析网页的时候,有多种方式可以可以提取网页元素。比如最基本的正则表达式、xpath、bs4、以及在scrapy中的css选择器。对于这些工具在爬虫的时候都遇到过,但是唯独喜欢用xpath,感觉提取很简介。同时也会掺杂一些正则表达式来做一些小的提取。

在记录xpath用法时,这里没有实际网页操作,仅当记住这种语法就是了。

操作语法

1、从根节点取元素,一般为<html>

/

2、选择所有的节点

//

这个表示选择所有的节点,例如 //div 表示选择网页中所有的div标签的内容。

3、添加元素的属性

@

例如:选取所有div下属性为class=nav的a标签下的href属性的值。

//div[@class="nav"]/a/@href

4、获取标签下的文本数据。

text()

例如:选取class="nav"的div下的ul下的li中所有的文本数据。

//div[@class="nav"]/ul/li/text()

5、选取某个大的标签下的所有文本数据,例如有个p标签,下面有span以及a标签,两个里面都有我们需要提取的文本,同时有可能在下一个p标签里面还有strong、h3等标签,此时我们需要使用string(.)

xpath('//div[@class="content"]//p').xpath("string(.)").extract()

高级语法

1、starts-with()

它是用来表示,某个属性以什么开头。

例如:我们在ul下有100个li标签,但是他们的id等于node1到node100,此时我们只需要这样写就可以提取。

xpath('//ul/li[starts-with(@id,"node")]/text()').extract()

2、contains()

它是用来指定某些元素包含了什么样的值,可以是属性,可以是文本。

例如:有个div标签下有class属性,它的值包含了,fh24 wh120 lx10等,此时你就可以下如下表达式来提取。

xpath('//div[contains(@class,"fh24")]/text()').extract()

同时你也可以用文本来作为提取标准,比如说,你想要提取下一页的链接。

xpath('//a[contains(text(),"下一页")]/@href').extract()

3、position()

这个是用来指定某个标签的位置。

例如:在ul标签下,有100li个标签,你想要提取第50个。

xpath('//ul/li[position()=50]/text()').extract()

4、last()

这个方法是用来指定,最后一个元素。

例如在class=nxt的div下面有5个a标签,我们需要最后一个,并且在下一页个数还会发生变化。此时就可以用last()。

xpath('//div[@class="nxt"]/a[last()]/@href').extract()

5、not()

这个方式是用来说明,某个标签不包含什么。

例如:在class=list的div元素中,其下面有20个a标签,其中这些a标签分为两类,一类有class="text"属性,一类没有。然而你想要提取没有属性的那一批。此时你可以这样写。

xpath('//div[@class="list"]/a[not(@class,"text")]/text()').extract()

xpath运算

同样的在xpath中,xpath也支持各种运算符。

最常见的以及最常用的主要包含

- 减

or 或者

and 和

> 大于

< 小于

= 等于

1、减法运算

比如我们需要获取倒数第二个标签。在class="list"的div下有20个a标签,你需要获取倒数第二个a标签的href

xpath('//div[@class="list"]/a[last()-1]/@href')

2、or运算,或运算

例如:在class="list"的div标签里面有100个a标签,其中有的a标签class="fh24",有的a标签class="wh20",有的a标签class="lx10",此时你只需要class="wh20"和class="lx10"的a标签,此时你可以这样做。

xpath('//div[@class="list"]/a[@class="wh20" or @class="lx10"]/text()').extract()

3、and运算,且运算,道理同上栗子就不举了。

4、>、<、=运算

例如:在id=title的div下的ul有100个li,你想要获取第23到98的li。你可以这样写。

xpath('//div[@id="title"]/ul/li[position()>=23 or position()<=98]/text()').extract()

猜你喜欢

转载自blog.csdn.net/yunlongl/article/details/81192059