zoukankan      html  css  js  c++  java
  • 爬虫五 Beautifulsoup模块详细

    一、基本使用

    from bs4 import BeautifulSoup

    htmlCharset = "GB2312"

    soup=BeautifulSoup(html_doc,'lxml', fromEncoding=htmlCharset) #具有容错功能,指定编码

    res=soup.prettify() #处理好缩进,结构化显示

     

    一、标签选择器

    print(soup.p) #存在多个相同的标签则只返回第一个
    print(soup.a) #存在多个相同的标签则只返回第一个
    print(soup.p.name)#获取标签的名称
    print(soup.p.attrs)#获取标签的属性
    print(soup.p.string)#获取表的内容
    print(soup.head.title.string)#嵌套选择
    print(soup.body.a.string)#嵌套选择
    print(soup.p.contents) #p下所有子节点
    print(soup.p.children) #得到一个迭代器,包含p下所有子节点
    print(soup.p.descendants) #获取子孙节点,p下所有的标签都会选择出来
    print(soup.a.parent) #获取a标签的父节点
    print(soup.a.parents) #找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲.
    print(soup.a.next_siblings) #得到生成器对象,获取标签下面的兄弟
    print(soup.a.previous_siblings) #得到生成器对象获取标签前面的兄弟

     二、标准选择器

      格式:find_all(name,attrs,recursive,text,**kwargs) 即find_all(标签名称,标签属性,嵌套查找,文本查找,**kwargs)

    1、按照标签名查找
    print(soup.find_all('a',id='link3',attrs={'class':"sister"}))
    print(soup.find_all('a')[0].find('span')) #嵌套查找
    
    #2、按照属性查找
    # print(soup.p.find_all(attrs={'id':'link1'})) #等同于print(soup.find_all(id='link1'))
    # print(soup.p.find_all(attrs={'class':'sister'}))
    # print(soup.find_all(class_='sister'))
    
    #3、按照文本内容查找
    print(soup.p.find_all(text="The Dormouse's story")) # 按照完整内容匹配(是==而不是in),得到的结果也是内容

    4、按正则表达式查找
     soup.findAll(re.compile('^b'))#默认已导入re本语句会查找所有b开头的标签,例如:body,b
    5、按照列表查找
    soup.findAll(['p','title'])#传入列表时,BeautifulSoup会将所有与列表中任一匹配的元素返回。

    4、find和find_all的异同
      1、find()相当于find_all()中limit=1的时候,而.limit参数是用于限制返回搜索的结果数,当搜索的达到limit限制时,就停止搜索返回搜索结果。
      2、find()返回的是结果,find_all()返回的是一个列表
      3、两者的使用格式都相同

    总结:
       soup.find_all(href=re.compile('baidu'))#href包含‘href’的tag
       soup.find_all(href=re.compile('baidu'),id='box1)#传入多个参数,找出同时满足两个条件的tag
      soup.find_all(class_='myclass')#找出class值为myclass的tag,注意下划线不能少
       soup.findAll(attrs={'class':'myclass','id'='box'})#特殊的参数可以定义字典参数来查找。查找多个参数时,也可以用此方法

        如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,
        如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性。
           当想用class的时候,由于class是python的关键词,不能直接用,可以用class_代替class

    五 CSS选择器

      1、CSS选择器

    print(soup.p.select('.sister'))    #
    print(soup.select('.sister span'))
    print(soup.select('#link1'))
    print(soup.select('#link1 span'))
    print(soup.select('#list-2 .element.xxx'))
    print(soup.select('#list-2')[0].select('.element')) #可以一直select,但其实没必要,一条select就可以了,嵌套查找
    print(soup.select('#list-2 h1')[0].attrs)# 获取属性
    print(soup.select('#list-2 h1')[0].get_text())# 获取内容
    soup.select('.myclass #box')#后代查找 soup.select('head>title')#子查找 soup.select('div+p')#相邻兄弟查找 soup.select('div~p’)#后续兄弟查找
    soup.select('.myclass a[id="box"]') #同时还可以加入属性查找。

    select()方法返回的是列表形式。
     
     
  • 相关阅读:
    Ubuntu16.04安装Docker、nvidia-docker
    Java 对象和类
    Java基础知识总结
    Java 学习路线
    编写radware的负载配置
    MySQL的主从复制+双主模式
    模拟MBR Grub故障修复
    搭建Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡
    golang数据库操作初体验
    我操蛋的2019
  • 原文地址:https://www.cnblogs.com/xuanan/p/7810305.html
Copyright © 2011-2022 走看看