美文网首页
爬虫学习笔记(二)--BeautifulSoup总结

爬虫学习笔记(二)--BeautifulSoup总结

作者: 不_初心 | 来源:发表于2017-12-09 13:02 被阅读0次

    一.BeautifulSoup是一个类,用来处理html文件有很多方法,实例化需要传入两个参数,一个是html文件,一个是'html.parser'

        #使用BeautifulSoup
    from bs4 import BeautifulSoup
    #一个例子
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    url='http://www.baidu.com'
    html=urlopen(url)
    bsobj=BeautifulSoup(html.read(),'html.parser')#直接把html内容转换为了BeautifulSoup类,传入html.read()参数,实例化类
    html_body=bsobj.body
    #若body中有h1标签
    html_h1=bsobj.body.h1
    

    二.BeautifulSoup的find()以及findAll()方法
    (1)find与findAll
     -findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
    返回的是<class 'bs4.element.ResultSet'>不能进行树形结构操作
    -find(self, name=None, attrs={}, recursive=True, text=None, **kwargs)
    返回的还是<class 'bs4.element.Tag'>时BeautifulSoup的基类,结构没有破坏,可以进行导航树操作
    可以查找该对象的子标签,后代标签,父标签,兄弟标签。
    其实find()是limit=1是findAll()
    这两个方法所有参数都是用默认值参数创建的(最后keyword是用关键字参数的收集
    ),所以可以没有任何
    1)tag:可以是一个标签,也可以是标签字典
    eg:obj.findAll({'h1','h2','h3'})
    2)attributes:是字典,key是属性,value是属性值(多个值时用字典表示)
    !!!!并且若只输入一个参数时!要加attrs={}!!!,否则会赋值给name
    eg:obj.findAll('span',{'class':{'green','red'}})
    返回html文档中红色和绿色两种颜色的span标签
    3)text:用标签的文本内容去匹配,text的内容也可以用正则表达式匹配模式进行匹配,即text=re.compile('')
    eg:obj.findAll(text='python')
    会返回所以的包含python内容的标签
    注:常用就这3个参数

    (2)导航树
    只有用find查找的结果才能进行导航树操作,因为原始结构还保留
    eg:

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    url='http://www.baidu.com'
    html=urlopen(url)
    bsobj=BeautifulSoup(html.read(),'html.parser')
    nuomi=bsobj.find('a',text='糯米')
    nuomi2=bsobj.findAll('a',text='糯米')
    
    
    print(type(nuomi))
    print(type(nuomi2))
    
    
    print('产生一个兄弟标签生成器','\n')
    for i in nuomi.next_siblings:#产生一个兄弟标签生成器(包含除自己之外的兄弟标签顺序有页面顺序决定)
        print(i)
    
    
    print('\n'*2,'糯米的下一个兄弟标签')
    print(nuomi.next_sibling)#下一个兄弟标签
    
    
    print('\n','糯米的父标签')
    print(nuomi.parent)#生产父标签
    
    
    u1=bsobj.find('div',{'class':'head_wrapper'})
    for i in u1.children:
        print(i)
    
    for i in u1.descendents:
        print(i)
    #会有很多结构,因为会列出子标签的子标签。
    

    三、获得文本和属性,lambda表达式
    (1)获得文本tag.getText()
    eg:>>> nuomi.getText()
    '糯米'
    (2)获得属性tag.attrs
    eg:>>> nuomi.attrs
    {'href': 'http://www.nuomi.com/?cid=002540', 'name': 'tj_trnuomi', 'class': ['mnav']}

    (3)在finAll函数中才能用lambda表达式:但是tag要作为lambda表达式的参数
        eg:soup.findAll(lambda tag:len(tag.attrs)==2)
    

    相关文章

      网友评论

          本文标题:爬虫学习笔记(二)--BeautifulSoup总结

          本文链接:https://www.haomeiwen.com/subject/lfbuixtx.html