美文网首页
BeautifulSoup简单使用

BeautifulSoup简单使用

作者: hcc_9bf4 | 来源:发表于2019-05-26 18:01 被阅读0次

    简单使用:
    说明:选择器 ,jquery
    基于选择器的使用
    from bs4 import BeautifulSoup
    使用方式:可以将一个html文件转化为指定的对象;然后通过对象的方法或者属性去查找指定的内容

    1. 转化本地文件:
      soup=BeautifulSoup(open('本地文件',‘lxml’))
    2. 转化网络文件:
      soup=BeautifulSoup('字符串类型或者字节类型',‘lxml’)

    例:本地文件soup.html

    <!doctype html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>测试bs4</title>
    </head>
    <body>
    <div>
    甄姬
    <p>百里守约</p>
    <p>李白</p>
    太乙真人
    </div>
    <div class="song">
    <p>李清照</p>
    <p>王安石</p>
    <p>苏轼</p>
    <p>柳宗元</p>
    <a href="http://www.song.com/" title="赵匡胤" target="_self">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>
    <a href="" class="song">总为浮云能蔽日,长安不见使人愁</a>
    <img src="http://www.baidu.com/meinv.jpg" alt="">
    </div>
    <div class="tang">
    <ul>
    <li><a href="http://www.baidu.com" title="qing">
    清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a></li>
    <li><a href="http://www.163.com" title="qin">
    秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li>
    <li><a href="http://www.126.com" alt="tang">
    气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
    <li><a href="http://www.sina.com" class="song">杜甫</a></li>
    <li><a href="http://www.haha.com" class="song">杜牧</a></li>
    <li><b>杜小月</b></li>
    <li><i>度蜜月</i></li>
    <li><a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a></li>
    </ul>>
    </div>
    </body>
    </html>

    ’print(soup)‘会把soup.html文件内容打开为字符串,封装str方法
    'print(tpye(soup))'会显示''<class 'bs4.BeautifulSoup'>''为bs4.BeautifulSoup的一个类,把类转化为soup对象,然后使用类的方法操作进行对象的操作

    1. 根据标签名查找

    soup.a 只能找到第一个符合要求的标签

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(open('soup_test.html',encoding='utf8'),'lxml')
    print(soup.a)

    • 查找a标签:
      soup.a---->print(soup.a)显示如下:

    <a href="http://www.song.com">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>

    print(type(soup.a))

    <class 'bs4.element.Tag'>

    • 查找div标签
      print(soup.div)显示:

    <div class="song">
    <p>李清照</p>
    <p>王安石</p>
    <p>苏轼</p>
    <p>柳宗元</p>
    <a href="http://www.song.com">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>
    </div>

    2. 获取属性

    • soup.a.attrs 获取所有属性和值,返回一个字典
    • soup.a.attrs['href'] 获取href属性
    • soup.a['href'] 也可简写为这种形式

    获取a的属性。包含href和内容,以href为例:
    ‘print(soup.a.href)’显示打印:

    None
    [Finished in 0.4s]

    ‘print(soup.a['href'])’显示打印:

    http://www.song.com
    [Finished in 0.4s]

    ‘print(soup.a['title'])’显示打印:

    赵匡胤
    [Finished in 0.4s]

    ‘print(soup.a['target'])’显示打印:

    _self
    [Finished in 0.4s]

    ‘print(soup.a.attrs)’显示打印a的所有属性,打印的是一个字典键值对:

    {'href': 'http://www.song.com/', 'title': '赵匡胤', 'target': '_self'}
    [Finished in 0.4s]

    • 以上获取a的属性方法等价于‘print(soup.a.attrs['href'])’<<=>>‘print(soup.a['href'])’

    3. 获取内容

    • soup.a.string
    • soup.a.text
    • soup.a.get_text()
      如果标签还有标签,那么string获取到的结果为None ,而其他两个可以获取文本内容

    print(soup.a.html)打印显示a的内容:

    None
    [Finished in 0.4s]

    错误,没有显示出来

    print(soup.a.text)打印显示a的内容:

    宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱
    [Finished in 0.4s]

    正确,可以显示出来
    还可以这么写'print(soup.a.string)'显示结果是一样的,如果a标签里还有标签那么显示为None
    还可以这么写’print(soup.a.get_text())‘显示结果也一样

    4.find方法:

    • soup.find('a') 找到第一个符合要求的a
    • soup.find('a',title="xxx")
    • soup.find('a',alt="xxx")
    • soup.find('a',class_="xxx")
    • soup.find('a',id="xxx")
    • find方法不仅soup可以调用,普通的div对象也能调用,会去指定的div里面去找符合要求的节点
    • find找到的都是第一个符合要求的标签

    print(soup.find('a'))显示内容为:

    <a href="http://www.song.com/" target="_self" title="赵匡胤">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>
    [Finished in 0.4s]

    print(soup.find('a',title='qin'))显示内容为:

    <a href="http://www.163.com" title="qin">
    秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>
    [Finished in 0.4s]

    print(soup.find('a',alt='tang'))显示内容为:

    <a alt="tang" href="http://www.126.com">
    气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>
    [Finished in 0.4s]

    print(soup.find('a',class_='song'))显示内容为:

    <a class="song" href="">总为浮云能蔽日,长安不见使人愁</a>
    [Finished in 0.4s]

    以上显示第一个标签class='song'的内容
    *如果想显示另外标签相同的class时,可以这么用

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(open('soup_test.html',encoding='utf8'),'lxml')
    div =soup.find('div',class_="tang")
    print(div.find('a',class_='song'))

    打印显示:

    <a class="song" href="http://www.sina.com">杜甫</a>
    [Finished in 0.4s]

    print(soup.find('a',id='yuan'))显示内容为:

    <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>
    [Finished in 0.4s]

    5. find_all方法

    soup.find_all('a')
    soup.find_all(['a'.'b'])
    soup.find_all('a',limit=2)限制前2个

    lt=soup.find_all('a')
    print(lt,len(lt))

    打印内容为所有标签a 及数量8

    [<a href="http://www.song.com/" target="_self" title="赵匡胤">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>, <a class="song" href="">总为浮云能蔽日,长安不见使人愁</a>, <a href="http://www.baidu.com" title="qing">
    清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
    秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
    气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>] 8
    [Finished in 0.4s]

    另外查找方法:

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(open('soup_test.html',encoding='utf8'),'lxml')
    div =soup.find('div',class_="tang")
    print(div.find_all('a'))
    显示:
    [<a href="http://www.baidu.com" title="qing">
    清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
    秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
    气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
    [Finished in 0.4s]

    • 可以打印a标签和b标签

    div =soup.find('div',class_="tang")
    print(div.find_all(['a','b']))

    显示:
    [<a href="http://www.baidu.com" title="qing">
    清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
    秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
    气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <b>杜小月</b>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
    [Finished in 0.4s]

    • 找到所有a标签只选前2个

    div =soup.find('div',class_="tang")
    print(div.find_all('a',limit = 2))

    显示:

    [<a href="http://www.baidu.com" title="qing">
    清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
    秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>]
    [Finished in 0.4s]

    6. select方法

    select选择器返回的永远是一个列表,需要通过下标提取指定的
    对象,获取属性和节点
    该方法也可以通过普通对象调用,找到都是这个对象下面符合要求的所有节点

    • 根据选择器选择指定的内容
      常见的选择器:标签选择器,类选择器,id选择器,组合选择器,层级选择器,伪类选择器,属性选择器
      a 标签选择器
      .dudu 类选择器
      井号lala(#lala) id选择器
      a, .duu, #lala, .meme 组合选择器
      div空格,dudu空格#lala空格.meme空格,xixi层级选择器---》没有要求,下面好多级
      div > p > a >.lala只能是下面一级
      input[name='lala']属性选择器

    类tang下面标签ul下面li下面的所有a标签,返回的是一个列表

    print(soup.select('.tang > ul > li > a'))

    显示:

    [<a href="http://www.baidu.com" title="qing">
    清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
    秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
    气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
    [Finished in 0.4s]

    如果想显示第三个string

    print(soup.select('.tang > ul > li > a')[2])

    显示:

    <a alt="tang" href="http://www.126.com">
    气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>
    [Finished in 0.4s]

    如果想通过ID查找,返回的是一个列表

    print(soup.select('#yuan'))

    显示:

    [<a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
    [Finished in 0.4s]

    如果想获取这个列表的汉字内容

    print(soup.select('#yuan')[0].text)

    凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘
    [Finished in 0.4s]

    如果想获取href

    print(soup.select('#yuan')[0]['href'])

    http://www.haha.com
    [Finished in 0.4s]

    普通对象使用select

    div =soup.find('div',class_="tang")
    print(div.select('.song'))

    [<a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>]
    [Finished in 0.4s]

    相关文章

      网友评论

          本文标题:BeautifulSoup简单使用

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