爬虫笔记整理

爬虫中节点选取方法-xpath,css选择器用法

xpath选择

  • 选取所有节点

    • xpath('//*')
      
  • 选取子节点

    • /获取直接子节点
    • //获取子孙节点
    • xpath('//li/a')
      
  • 选取父节点

    • 按位置和属性来获取,@代表属性,@也可用于过滤
      • xpath('//a[@href="link4.html"]/../@class')
        
      • xpath('//a[@href="link4.html"]/parent::*/@class')
        
  • 按序选择

    • 选取第一个 li[1]

      • xpath('//li[1]/a/text()')
        
    • 选取最后一个li[last]

      • xpath('//li[last()]/a/text()')
        
    • 选取任意位置 li[position()

      • xpath('//li[position()<3]/a/text()')
        
    • 反向选取li[last()-2]

      • xpath('//li[last()-2]/a/text()')
        
  • 节点轴选择

    • 祖先节点,ancestor

      • xpath('//li[1]/ancestor::*')
        
      • xpath('//li[1]/ancestor::div')
        
    • 获取所有属性值attribute

      • xpath('//li[1]/attribute::*')
        
    • 子节点选择,可以加筛选条件,child

      • xpath('//li[1]/child::a[@href="link1.html"]')
        
    • 获取所有子孙节点,加入限定条件,不加为*,descendant

      • xpath('//li[1]/descendant::span"]')
        
    • 选取当前节点之后的所有节点,following

      • xpath('//li[1]/following::*[2]"]')
        
    • 获取当前节点的所有同级节点,following-sibiling

      • xpath('//li[1]/following-sibling::*"]')
        
  • 属性多值匹配(contains),contains

    • xpath('//li[contains(@class,"li")]/a/text()')
      
  • 多属性匹配 class属性里的para

    • xpath('//div[contains(@class,"para") and contains(@label-module,"para")]/text()')
      
  • 这里的节点选取要准确否则匹配不到文本

    • 获取过滤的属性

      • xpath('//li[@class="item-0"]/a/text()')
        
    • 获取全部的属性

      • xpath('//li/a/@href')
        

BeautifulSoup

  • 导入模块

    • from bs4 import BeautifulSoup
      
  • 创建对象

    • soup = BeautifulSoup(html,lxml)
      
  • 类型

    • bs4.element.Tag类型
  • 获取属性

    • 获取节点名称,name
      • soup.title.name
    • 获取节点所有属性,attrs
      • soup.p.attrs
    • 获取节点内容
      • soup.p.string
  • 嵌套选择

    • soup.head.title
      • soup.head.title.string
  • 关联选择

    • 返回的是直接子节点的列表
    • soup.p.contents
    • 子节点
      • soup.p.children
    • 子孙节点
      • soup.p.descendants
    • 父节点和祖先节点
      • soup.a.parent
      • soup.a.parents
    • 下一个,上一个,兄弟节点,祖先节点
      • soup.a.next_sibling
      • soup.a.previous_sibling
      • soup.a.next_siblings
      • soup.a.previous_siblings
  • 获取信息

    • list(soup.a.parents)[0]
      
    • list(soup.a.parents)[0].attrs['class']
      
  • 方法选择器

    • find_all

      • soup.find_all(name='ul')
        
      • for ul in soup.find_all(name='ul')
        	for li in ul.find_all(name='li')
          	print(li.string)
        
      • 传入属性查询,attrs

        • soup.find_all(attrs={'id':'list-1'}
          
      • 关键词冲突时后加下划线

        • soup.find_all(class_='element')
          
      • 获取文本text,利用正则来匹配需要的内容

        • soup.find_all(text=re.compile('link'))
          
    • find(),返回单个元素

      • 方法同find_all()只不过返回的是第一个元素
    • find_parent()

    • find_parents()

    • find_next_siblings()

    • find_next_sibiling()

    • find_previous_siblings()

    • find_previous_sibling()

    • find_all_next() 返回节点后所有符合的内容

    • find_next() 返回节点后第一个符合的内容

    • find_all_previous()

    • find_previous()

  • css选择器,select方法

    • soup.select('.panel .panel-heading')
      
    • 嵌套选择

      • for ul in soup.select('ul')
        	print(ul.select('li'))
        
    • 获取属性

      • for ul in soup.select('ul')
        	print(ul['id'])
          print(ul.attrs['id'])
        
    • 获取文本

      • for li in soup.select('li')
        	print(li.get_text())
          print(li.string)
        

pyquery

  • 类型

    • PyQuery类型
  • 导入模块

    • from pyquery import PyQuery as pq
  • 字符串初始化方法

    • doc = pq(html)
  • URL初始化方法

    • doc = pq(url=‘https://www.baidu.com’)
  • 文件初始化方法

    • doc = pq(filename='demo.html')
      
  • 基本css选择器

    • doc('#content .list li')
      
  • 查找节点

    • find()获取所有子节点

      • items = doc('.list')
        lis = items.find('li')
        
    • children()

      • items = doc('.list')
        lis = items.children('li')
        
    • parent()这里可以加入过滤器选择

      • items = doc('.list')
        lis = items.parent('li')
        
    • parents()

  • 遍历节点,items,可用于提取节点,返回为一个生成器,经过遍历获得各个子节点

    • lis = doc('li').items()
      for i in lis:
        print(i)
      
  • 获取信息

    • 获取属性

      • 返回多个节点时,调用attr(),只会得到第一个节点属性
      • 通过遍历可返回所有节点的属性
      • a = doc('.item-0.active a')
        print(a.attr('href'))
        print(a.attr.href)
        for item in a.items():
          print(item.attr('href'))
        
    • 获取文本

      • doc = pq()
        a = doc('.item-0.active a')
        print(a.text)
        print(a.html())
        
    • 节点操作

      • addClass和removeClass
        • doc = pq()
          li = doc('.item-0.active')
          li.removeClass('active')
          li.addClass('active')
          
    • attr,text,html

      • doc = pq()
        li = doc('.item-0.active')
        #attr()属性修改属性,第一个参数为属性名,第二个参数为属性值
        li.attr('name','link')
        #修改文本内容,标签
        li.text('change item')
        li.html('changed item')
        
  • 伪类选择器

    • doc = pq()
      #获取第一个节点
      li = doc('li:first-child')
      #获取最后一个节点
      li = doc('li:last-child')
      #获取第二个节点
      li = doc('li:nth-child(2)')
      #获取第三个节点
      li = doc('li:gt(2)')
      #获取偶数节点
      li = doc('li:nth-child(2n)')
      #获取包含指定节点的节点
      li = doc('li:contains(second)')
      

你可能感兴趣的:(spider,爬虫,笔记,BeautifusSoup,xpath,节点选择)