美文网首页
Beautiful Soup使用

Beautiful Soup使用

作者: 中华小强仔 | 来源:发表于2018-08-06 18:06 被阅读0次

    Beautiful Soup使用


    Beautiful Soup官方文档是一个HTML/XML的解析器,主要的功能是如何解析和提取HTML/XML数据;
    lxml只会局部遍历,而Beautiful Soup是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此解析时间和内存开销都会大很多,所以性能要低于lxml;
    BeautifulSoup用来解析 HTML比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxmlXML解析器;

    安装

    pip install beautifulsoup4
    

    1.语法


    创建soup对象
        from bs4 import BeautifulSoup
        # html为解析文本, 'lxml'指定解析器
        soup = BeautifulSoup(html, 'lxml')
        # 格式化输出 soup 对象的内容
        print(soup.prettify())
    

    一、find_all()使用

    参数: find_all(name, attrs, recursive, text, **kwargs)**

    1)name参数

    name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉

    A.字符串

    最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,Beautiful Soup会查询与字符串完整匹配的内容;

    # 查询标签名称为<p></p>标签的元素列表
    soup.find_all('p')
    

    B.正则

    如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和标签都应该被找到

    soup.find_all(re.compile(r'^b'))
    

    C.列表

    如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回

    # 查询html中标签名称为<p></p>或者<b></b>的元素
    soup.find_all(["p", "b"])
    

    2) keyword参数

    # 查询<p></p>标签对象的class属性是title的元素
    soup.find_all('p',attrs={'class':'title'})
    

    3)text参数

    通过 text 参数可以搜索文档中的字符串内容,与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表

    soup.find_all(text="Elsie")
    
    soup.find_all(text=["Tillie", "Elsie", "Lacie"])
    
    soup.find_all(text=re.compile("Dormouse"))
    

    二、find使用

    find的用法与find_all一样,区别在于find返回 第一个符合匹配结果,find_all则返回 所有匹配结果的列表

    三、 CSS选择器

    CSS选择器与 find_all 方法有异曲同工之妙的查找方法,也是返回所有匹配结果的列表。

    • 写 CSS 时,标签名不加任何修饰,类名前加.,id名前加#
    • 在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list

    (1)通过标签选择器查找

        soup.select('title')
        # 结果-->[<title>The Dormouse's story</title>]
    

    (2)通过类选择器查找

    soup.select('.title')
    # 结果-->[<p class="title" name="dromouse"><b>The Dormouse's story</b></p>]
    

    (3)通过id选择器查询

    soup.select('#link1')
    # 结果-->[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
    

    (4)层级选择器查询

    soup.select('p #link1')
    # 结果-->[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
    

    (5)通过属性选择器

    soup.select("a[class='sister']")
    

    (6)get_text()获取文本内容

    以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容

    (7)获取属性

    # 创建Beautiful Soup对象
    soup = BeautifulSoup(html, 'lxml')  
    # 打印<a></a>标签的href属性
    print(soup.select('a')[0].get('href'))
    print(soup.find('a').get('href'))
    print(soup.find_all('a')[0].get('href'))
    print(soup.find('p').get('name'))
    # 打印结果
    http://example.com/elsie
    http://example.com/elsie
    http://example.com/elsie
    dromouse
    

    2. bs4的四大对象


    Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

    • Tag
    • NavigableString
    • BeautifulSoup
    • Comment

    代码展示

    # 创建Beautiful Soup对象
    soup = BeautifulSoup(html, 'lxml')
    # 打印获取的对象类型
    print(type(soup.a))
    print(type(soup.p.string))
    print(type(soup))
    print(type(soup.a.string))
    

    打印结果

    <class 'bs4.element.Tag'>
    <class 'bs4.element.NavigableString'>
    <class 'bs4.BeautifulSoup'>
    <class 'bs4.element.Comment'>
    

    3.遍历文档树


    3.1 获取子节点:.contents,.children属性

    3.1.1 .content

    tag的.content属性可以将tag的子节点以列表方式输出

    # 创建Beautiful Soup对象
    soup = BeautifulSoup(html, 'lxml')
    # 把soup对象中第一个<p></p>标签的子节点以列表形式输出
    print(soup.p.contents)
    

    输出结果

    [<b>The Dormouse's story</b>, <a>3</a>]
    

    3.1.2.children

    它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。
    我们打印输出 .children 看一下,可以发现它是一个 list 生成器对象

    soup.p.children
    <list_iterator object at 0x000002ADD46B95F8>
    

    相关文章

      网友评论

          本文标题:Beautiful Soup使用

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