zoukankan      html  css  js  c++  java
  • BeautifulSoup详解

    引入BeautifulSoup:

    from bs4 import BeautifulSoup
    #意思就是从bs4这个包里面引入BeautifulSoup这个类

    之后,使用以下语法来把请求之后的响应传入解析器:

    soup = BeautifulSoup(response.text, features='lxml')

    features='lxml’是一个声明解析的方式,相应的解释方式还有:

    html.parse
    html5lib
    xml 【这个是唯一支持XML的解析器】


    详细的区别请移步百度去百度相应的解释方式是什么意思。因为一般lxml就基本满足使用了。

    1.访问单个标签:

    print(soup.h1)#(连标签也一起返回了)

    2.查找所有标签:

    all_a = soup.find_all('a')
    print(all_a)
    #查找所有的 a 标签,返回的是一个所有a标签组成的列表
    
    all_href = [a['href'] for a in all_a]  
    #循环所有a标签组成的列表 里面的 所有 a标签,
    #并访问其'href'属性,这里的访问规则就像是访问字典一样。
    print('
    ', all_href) #返回所有的href属性的值组成的列表 

    其实BeautifulSoup能做的事情可多着呢
    例如:

    soup = BeautifulSoup(response.text, features='lxml')
    month = soup.find_all('li',{"class" : "month"})#访问所有  含有"month"的class属性的li标签,返回满足条件的所有li标签组成的列表。
    for m in month:
        print(m.get_text()) #get_text()获取标签的文字内容【字符串内容、值【不是属性的值】】
    
    #或者
    month = soup.find_all(class_= "month"})

    BeautifulSoup还能在一棵树中多次使用,意思就是相当于一个循环的作用。

    jan = soup.find('ul', {"class": 'jan'})
     #查找class属性值为jan的标签内的所有内容组成的XML树
    d_jan = jan.find_all('li')              #使用前面返回的结果列表作为父亲(作为这一次的Tag对象),返回所有'li'标签组成的列表
    for d in d_jan:#遍历这个li标签组成的列表,寻找所需要信息
        print(d.get_text())

    BeautifulSoup属性查找

    soup = BeautifulSoup(response.text,'lxml')
    print(soup.find_all(attrs={'id':'list-1'})) #查找id为list-1的标签包含的所有标签,id也可以换成其它属性
    
    #此外,soup.find_all()直接支持id以及class的快捷查找
    soup.find_all(id = 'idvalues')
    soup.find_all(class_ = 'classvalues')

    当BeautifulSoup遇上正则表达式

    soup = BeautifulSoup(htmlre, features='lxml')
    
    #find_all函数的第一个参数填入标签,第二个参数填入具体找的东西【很多时候填入属性和值,也有时候需要用正则表达式】
    img_links = soup.find_all("img", {"src": re.compile('.*?.jpg')})
    for link in img_links: #遍历获取到的图片链接组成的列表
        print(link['src'])

    经历了find()和find_all()方法,下面接触CSS选择器【BeautifulSoup的select()方法】
    一个例子:

    html = '''
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Test</title>
    </head>
    <body>
    <div class="panel">
        <div class="panel-heading">
            <h4>Good happy</h4>
        </div>
        <div class="panel-body">
            <ul class="list" id="list-1">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
                <li class="element">Lay</li>
            </ul>
            <ul class="list list-smail" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    
    </body>
    </html>
    '''

    1.对于class 语法: .class属性的值 返回列表(严肃点这是一个bs4.element.Tag)

     print(soup.select('.panel .panel-heading'))

    
    #根据CSS来选择,选择class='panel'下的class='panel-heading'的标签里包含的所有标签,包含他本身,组成的列表
    
     print(soup.select('ul li')) #选择并返回所有的ul、li标签组成的列表
    
    

    2.对于id 语法:#id属性的值 返回列表

     print(soup.select('#list-1')) #选择id=list-1 里面的所有标签以及他本身
     print(soup.select('#list-1 .element')) #选择id=list-1下的class属性值为element 里面的所有标签以及他本身

    3.获取属性的值

    for ul in soup.select('ul'):
        print(ul['id'])#获取ul的id属性的值
        print(ul.attrs['id'])  #或者attrs获取属性的值

    4.获取标签的内容

    for ul in soup.select('li'):
        print(ul.get_text()) #获取<tag>string</tag>里面的string
  • 相关阅读:
    部署asp.net出现了问题
    给中国学生的第三封信[转载:李开复]
    给中国学生的第四封信:[转载:李开复]
    GMAIL DRIVE 提供邮箱一样大小的硬盘
    天气凉了,好舒服
    Asp.net与SQL一起打包部署安装
    无刷新联动下拉菜单(DotTextWeb版)
    我的主界面
    DataList绑定时控制字符串长度
    给中国学生的第一封信 [转载:李开复]
  • 原文地址:https://www.cnblogs.com/chenruhai/p/12464232.html
Copyright © 2011-2022 走看看