分享

Scrapy--xpath/css

 小猪窝969 2019-01-02
xpath使用
简介
  xpath使用路径表达式在xml和html中进行导航
 
语法
复制代码
body    # 选取所有body元素的所有子节点

/html   # 选取根元素

body/a  # 选取所有属于body的子元素的a元素

//div   # 选取所有dic子元素(任意地方)

body//div   # 选取所有属于body元素的后代的div元素(body下任意位置)

//@class    # 选取所有名为class的属性

/body/div[1]    # 选取属于body子元素的第一个div元素

/body/div[last()]   # 选取属于body子元素的最后一个div元素

//div[@lang]    # 选取所有拥有lang属性的div元素

//div[@lang='eng']  # 选取所有lang属性为eng的div元素

/div/*  # 获取属于div元素的所有子节点

//* # 选取所有元素

//div[@*]   # 获取所有带属性的div元素

/div/a|//div/p  # 获取所有div的子元素a和p

//span|ul   # 选取文档中的span和ul元素

body/div/p|//span  # 选取所有body下的div下的p元素和所有span元素

//span[contains(@class, 'vote-post-up')]    # 寻找所有属性为class的值中包含vote-post-up的span标签
//span[start-with(@class, 'vote')]    # 寻找所有属性为class的值中已vote开头的span标签
//span[end-with(@class, 'up')]    # 寻找所有属性为class的值中已up结尾的span标签
//span[re:test(@class, 'vote-\d$')]    # 寻找所有属性为class的值中正则匹配(vote-数字)的span标签#


<html>
 <head>
  <base href='http:///' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
  </div>
 </body>
</html>
#re获取正则表达式获取的所有数据
>>> response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
[u'My image 1',
 u'My image 2',
 u'My image 3',
 u'My image 4',
 u'My image 5']
#re_first获取正则表达式获取的第一个数据
>>> response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
u'My image 1'>>> 

复制代码

 

xpath对象
  response.xpath()返回的对象可以被无限调用,执行xpath方法继续搜索html内容
 
实例
def parse(self, response):
    title = response.xpath('//div[@class="entry-header"]/h1/text()').extract_first("")
    create_date = response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0].strip().replace("·","").strip()
    praise_nums = response.xpath("//span[contains(@class, 'vote-post-up')]/h10/text()").extract()[0]
    fav_nums = response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").extract()[0]

 

css选择器
简介
  根据标签元素间的层叠关系和元素本身属性获取我们想要的标签
 
语法
复制代码
*   # 选择所有节点

#container  # 选择id为container的节点

.container  # 选取所有class包含container的节点

.container.hearder  # 选取所有class同时包含container和hearder的节点

li a    # 选取所有li下的所有a节点

ul + p  # 选择ul后面的第一个p元素

div#container > ul # 选取id为container的div的第一个ul子元素

ul ~ p # 选取与ul相邻的所有p元素

a[title]    # 选取所有title属性的a元素

a[href="http://www.baidu.com"]  # 选取所有href属性为http://www.baidu.com的a元素

a[href*="baidu"]    # 选取href属性包含baidu的a元素

a[href^="http"]     # 选取href属性以http开头的a元素

a[href$=".html"]     # 选取href属性以html结尾的a元素

input[type=radio]:checked   # 选取选中的radio的元素

div:not(#container) # 选取所有id非container的div属性

li:nth-child(3)     # 选取第三个li元素

tr:nth-child(2n)    # 选取偶数位tr元素
复制代码

 

使用方式和xpath相似
def parse(self, response):
    title = response.css(".entry-header h1::text").extract()[0]
    create_date = response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip().replace("·","").strip()
    praise_nums = response.css(".vote-post-up h10::text").extract()[0]
    fav_nums = response.css(".bookmark-btn::text").extract()[0]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多