标签:inpu re模块 tla 一个 常用 方式 例子 使用 scrapy
以伯乐在线文章为爬取目标blog.jobbole.com,发现在"最新文章"选项中可看到所有文章
import scrapy class JobboleSpider(scrapy.Spider): name = ‘jobbole‘ allowed_domains = [‘blog.jobbole.com‘] start_urls = [‘http://blog.jobbole.com/‘] def parse(self, response): re_selector = response.xpath(‘//*[@id="post-110287"]/div[1]/h1/text()‘)
<html><body><div> <ul> <li class="item-0"><a href="link1.html"><span>first item</span></a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div></body></html>
首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性 result1 = response.xpath(‘//a[@href="link4.html"]/../@class‘) 我们也可以通过parent::来获取父节点 result2 = response.xpath(‘//a[@href="link4.html"]/parent::*/@class‘)
获取class为item-1的li节点文本, result3 = response.xpath(‘//li[@class="item-0"]/a/text()‘) 返回结果为[‘first item‘, ‘fifth item‘]
获取所有li节点下的所有a节点的href属性 result4 = response.xpath(‘//li/a/@href‘) 返回结果为[‘link1.html‘, ‘link2.html‘, ‘link3.html‘, ‘link4.html‘, ‘link5.html‘]
result = response.xpath(‘//li[1]/a/text()‘) #选取第一个li节点 result = response.xpath(‘//li[last()]/a/text()‘) #选取最后一个li节点 result = response.xpath(‘//li[position()<3]/a/text()‘) #选取位置小于3的li节点,也就是1和2的节点 result = response.xpath(‘//li[last()-2]/a/text()‘) #选取倒数第三个节点
1)返回第一个li节点的所有祖先节点,包括html,body,div和ul result = response.xpath(‘//li[1]/ancestor::*‘) 2)返回第一个li节点的<div>祖先节点 result = response.xpath(‘//li[1]/ancestor::div‘) 3)返回第一个li节点的所有属性值 result = response.xpath(‘//li[1]/attribute::*‘) 4)首先返回第一个li节点的所有子节点,然后加上限定条件,选组href属性为link1.html的a节点 result = response.xpath(‘//li[1]/child::a[@href="link1.html"]‘) 5)返回第一个li节点的所有子孙节点,然后加上只要span节点的条件 result = response.xpath(‘//li[1]/descendant::span‘) 6)following轴可获得当前节点之后的所有节点,虽然使用了*匹配,但是又加了索引选择,所以只获取第2个后续节点,也就是第2个<li>节点中的<a>节点 result = response.xpath(‘//li[1]/following::*[2]‘) 7)following-sibling可获取当前节点之后的所有同级节点,也就是后面所有的<li>节点 result = response.xpath(‘//li[1]/following-sibling::*‘)
<li class="li li-first"><a href="link.html">first item</a></li> result5 = response.xpath(‘//li[@class="li"]/a/text()‘) 返回值为空,因为这里HTML文本中li节点为class属性有2个值li和li-first,如果还用之前的属性匹配就不行了,需要用contain()函数 正确方法如下 result5 = response.xpath(‘//li[contains(@class, "li")]/a/text()‘) contains()方法中,第一个参数为属性名,第二个参数传入属性值,只要此属性名包含所传入的属性值就可完成匹配
from lxml import etree text = ‘‘‘ <li class = "li li-first" name="item"><a href="link.html">first item</a></li> ‘‘‘ html = etree.HTML(text) result6 = html.xpath(‘//li[contains(@class, "li") and @name="item"]/a/text()‘) print(result)
>>> title = response.xpath(‘//div[@class="entry-header"]/h1/text()‘) >>> title [<Selector xpath=‘//div[@class="entry-header"]/h1/text()‘ data=‘2016 腾讯软件开发面试题(部分)‘>] >>> title.extract() [‘2016 腾讯软件开发面试题(部分)‘] >>> title.extract()[0] ‘2016 腾讯软件开发面试题(部分)‘ >>> title.extract_first() ‘2016 腾讯软件开发面试题(部分)‘
>>> response.xpath("//p[@class=‘entry-meta-hide-on-mobile‘]/text()").extract()[0].strip().replace("·","").strip() ‘2017/02/18‘
>>> response.xpath("//span[contains(@class, ‘vote-post-up‘)]/h10/text()").extract() [‘2‘] >>> response.xpath("//span[contains(@class, ‘vote-post-up‘)]/h10/text()").extract()[0] ‘2‘ >>> int(response.xpath("//span[contains(@class, ‘vote-post-up‘)]/h10/text()").extract()[0]) 2
>>> response.xpath("//span[contains(@class, ‘bookmark-btn‘)]/text()").extract()[0] ‘ 28 收藏‘ >>> string = response.xpath("//span[contains(@class, ‘bookmark-btn‘)]/text()").extract()[0] >>> import re >>> pattern = re.match(".*?(\d+).*", string) >>> pattern.group(1) ‘28‘
可以简写为
>>> response.xpath("//span[contains(@class, ‘bookmark-btn‘)]/text()").re(‘.*?(\d+).*‘) [‘28‘] >>> response.xpath("//span[contains(@class, ‘bookmark-btn‘)]/text()").re(‘.*?(\d+).*‘)[0] ‘28‘
找到不是以"评论"结尾的元素 >>> response.xpath("//p[@class=‘entry-meta-hide-on-mobile‘]/a/text()").extract() [‘职场‘, ‘ 9 评论 ‘, ‘面试‘] >>> tag_list = response.xpath("//p[@class=‘entry-meta-hide-on-mobile‘]/a/text()").extract() >>> [element for element in tag_list if not element.strip().endswith("评论")] [‘职场‘, ‘面试‘] >>> tag_choose=[element for element in tag_list if not element.strip().endswith("评论")] >>> tags=",".join(tag_choose) >>> tags ‘职场,面试‘
li a
|
选取所有li下的所有a节点
|
ul + p
|
选择ul后面的第一个p元素,ul和p是兄弟节点
|
div#container>ul
|
选取id为container的div标签,下边的第一个ul子元素
|
ul ~ p
|
选取与ul相邻的所有p元素
|
a[title]
|
选取所有含有title属性的a元素
|
a::attr(href)
|
获取所有a元素的href属性值
|
a[href="http://jobbole.com"]
|
选取所有href属性为http://jobbole.com值的a元素
|
a[href*="jobble"]
|
选取所有href属性包含jobbole的a元素
|
a[href^="http"]
|
选取所有href属性值以http开头的a元素
|
a[href$=".jpg"]
|
选取所有href属性值以.jpg结尾的a元素
|
input[type=radio]:checked
|
选择选中的radio的元素
|
div:not(#container)
|
选取所有id不等于container的div元素
|
li:nth-child(3)
|
选取第三个li元素
|
tr:nth-child(2n)
|
选取偶数位的tr元素
|
>>> response.css(".entry-header h1").extract() [‘<h1>2016 腾讯软件开发面试题(部分)</h1>‘] >>> response.css(".entry-header h1::text").extract()[0] ‘2016 腾讯软件开发面试题(部分)‘
>>> response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip().replace(" ·","") ‘2017/02/18‘
>>> response.css(".vote-post-up h10::text").extract()[0] ‘2‘
>>> response.css(".bookmark-btn::text").extract()[0] ‘ 28 收藏‘ >>> string = response.css(".bookmark-btn::text").extract()[0] >>> tag=re.match(".*?(\d+).*", string) >>> tag.group(1) ‘28‘
其实正则re也是scrapy的内置模块,可以简写为如下
>>> response.css(".bookmark-btn::text").re(‘.*?(\d+).*‘) [‘28‘] >>> response.css(".bookmark-btn::text").re(‘.*?(\d+).*‘)[0] ‘28‘
response.css("div.entry").extract()[0]
>>> response.css("p.entry-meta-hide-on-mobile a::text").extract() [‘职场‘, ‘ 9 评论 ‘, ‘面试‘]
标签:inpu re模块 tla 一个 常用 方式 例子 使用 scrapy
原文地址:https://www.cnblogs.com/yunlongaimeng/p/11526418.html