众所周知,在设计爬虫时,最麻烦的一步就是对网页元素进行分析,目前流行的网页元素获取的工具备BeautifulSoup,lxml等,而据我使用的体验而言,Scrapy的元素选择器Xpath(结合正则表达式)是其中较为出色的一种,功能相对较全、使用较为方便,正由于它的丰富性,有时不少功能会忘记,因此在这里整理好记录下来,方便从此查阅使用。javascript
response.xpath('//table/tbody/tr/td') //若是知道元素所属的下标能够用下标选择
response.xpath('//table/tbody/tr[1]/td')
跳级定位:符号“//”表示跳级定位,即对当前元素的全部层数的子元素(不只是第一层子元素)进行查找,通常xpath的开头都是跳级定位php
response.xpath('//span//table')
每一个html元素都有不少属性,如id、class、title、href、text(href和text每每能够配合正则表达式)等,这些属性每每具备很强的特殊性,结合元素多级定位或跳级定位会更准确高效,下面举几个典型的例子,其余的触类旁通html
利用class定位java
response.xpath('//td[@class="mc_content"]')
利用href配合正则表达式定位正则表达式
response.xpath('//a[re:test(@href,"^\/index\.php\?m=News&a=details&id=1&NewsId=\d{1,4}")]')
利用text结合正则表达式定位scrapy
a=response.xpath('//a[re:test(text(),"\w{4}")]')
此外,xpath还有对于html元素操做的两个实用的函数(能够用正则表达式代替)——starts-with和contains;函数
a=response.xpath('//a[starts-with(@title,"注册时间")]') a=response.xpath('//a[contains(text(),"闻")]')
3. 提取元素或元素的属性值工具
首先是最基本的extract()函数,提取被定为的元素对象测试
a=response.xpath('//a[contains(text(),"闻")]').extract() //若是被定为的元素对象有多个,能够有用下标指定
a=response.xpath('//a[contains(text(),"闻")]').extract()[1]
提取元素的属性spa
//提取text
a=response.xpath('//a[contains(text(),"闻")]/text()').extract() //获取href
a=response.xpath('//a[contains(text(),"闻")]/@href').extract() //获取name
a=response.xpath('//a[contains(text(),"闻")]/@name').extract()
此时咱们的正则表达式又闲不住了(scrapy自带的函数),能够对提取的元素进行选择
//对href中的部分字符串进行选择
response.xpath('//a[@name="_l_p_n"]/@href').re('\/s.*?list\.htm')
在这里关于xpath的全部用法基本总结完毕,只是因为xpath是对静态元素进行匹配选择,对于javascript每每一筹莫展,这时不得不用一个自动化测试工具——selenium,能够实现各类动态事件和静态元素的选择,只是selenium每每比较吃内存,响应时间也比较慢,对于大型的爬虫任务尽可能不要使用,毕竟有一些javascript元素是内嵌在网页代码中的,这时候结合万能的正则表达式,xpath每每可以实现。以下:
link = re.search("javascript:goToPage\('(.*?)'", value) //value为包含该段的字符串