• BeautifulSoup相关的用法


    from bs4 import BeautifulSoup
    
    html = '''
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" name="alex"><b>The Dormouse's story</b></p>
    
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    <p class="story">...</p>
    '''
    soup = BeautifulSoup(html, "lxml")
    print(soup.prettify())
    print(soup.title)
    print(soup.title.name)
    print(soup.title.string)
    print(soup.title.parent.name)
    print(soup.p)
    print(soup.p["class"])
    print(soup.a)
    print(soup.find_all('a'))
    print(soup.find(id='link3'))

    上述为选择器的大体使用方法

     

    基本使用标签选择器

    print(soup.title)
    print(type(soup.title))
    print(soup.head)
    print(soup.p)

    通过这种soup.标签名 我们就可以获得这个标签的内容这里有个问题需要注意,通过这种方式获取标签,如果文档中有多个这样的标签,返回的结果是第一个标签的内容,如上面我们通过soup.p获取p标签,而文档中有多个p标签,但是只返回了第一个p标签内容

    获取名称

    当我们通过soup.title.name的时候就可以获得该title标签的名称,即title

    获取属性

    print(soup.p.attrs['name'])
    print(soup.p['name'])

    上面两种方式都可以获取p标签的name属性值

    获取内容

    print(soup.p.string)

    结果就可以获取第一个p标签的内容:The Dormouse's story

    嵌套选择

    我们直接可以通过下面嵌套的方式获取

    print(soup.head.title.string)

    子节点和子孙节点

    contents的使用
    通过下面例子演示:

    html = """
    <html>
        <head>
            <title>The Dormouse's story</title>
        </head>
        <body>
            <p class="story">
                Once upon a time there were three little sisters; and their names were
                <a href="http://example.com/elsie" class="sister" id="link1">
                    <span>Elsie</span>
                </a>
                <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
                and
                <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
                and they lived at the bottom of a well.
            </p>
            <p class="story">...</p>
    """
    
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html,'lxml')
    print(soup.p.contents)

    children的使用

    通过下面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,
    但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息

    print(soup.p.children)
    for i,child in enumerate(soup.p.children):
        print(i,child)

    通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendantsprint(soup.descendants)同时这种获取的结果也是一个迭代器


    父节点和祖先节点

    通过soup.a.parent就可以获取父节点的信息通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中,并且最后还会讲整个文档放到列表中,所有列表的最后一个元素以及倒数第二个元素都是存的整个文档的信息

     

     

    兄弟节点

    soup.a.next_siblings 获取后面的兄弟节点
    soup.a.previous_siblings 获取前面的兄弟节点
    soup.a.next_sibling 获取下一个兄弟标签
    souo.a.previous_sinbling 获取上一个兄弟标签

    标准选择器

    find_all(name,attrs,recursive,text,**kwargs
    可以根据标签名,属性,内容查找文档

    name的用法

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</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">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    # print(soup.find_all('ul'))  # 返回的结果是一个列表
    # print("goal", soup.find_all('ul')[0])
    # print(type(soup.find_all('ul')[0]))  # <class 'bs4.element.Tag'>
    for ul in soup.find_all('ul'):
        print(ul.find_all('li'))   # 列表方式展现标签

    attrs例子如下

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</h4>
        </div>
        <div class="panel-body">
            <ul class="list" id="list-1" name="elements">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
                <li class="element">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    print(soup.find_all(attrs={'id': 'list-1'}))
    print(soup.find_all(attrs={'name': 'elements'}))

    attrs可以传入字典的方式来查找标签,但是这里有个特殊的就是class,因为class在python中是特殊的字段,所以如果想要查找class相关的可以更改attrs={'class_':'element'}或者soup.find_all('',{"class":"element}),特殊的标签属性可以不写attrs,例如id

     

    text
    例子如下:

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</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">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    print(soup.find_all(text='Foo'))   # 结果返回的是查到的所有的text='Foo'的文本  结果['Foo', 'Foo']

    find
    find(name,attrs,recursive,text,**kwargs)
    find返回的匹配结果的第一个元素

    其他一些类似的用法:
    find_parents()返回所有祖先节点,find_parent()返回直接父节点。
    find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
    find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
    find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点
    find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

    css选择器

    通过select()直接传入CSS选择器就可以完成选择熟悉前端的人对CSS可能更加了解,其实用法也是一样的.表示class #表示id标签1,标签2 找到所有的标签1和标签2标签1 标签2 找到标签1内部的所有的标签2[attr] 可以通过这种方法找到具有某个属性的所有标签[atrr=value] 例子[target=_blank]表示查找所有target=_blank的标签

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</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">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    print(soup.select('.panel .panel-heading'))  # 里面就是找.panel里面的.panel-heading 只显示最终目标的结果
    print(soup.select('ul li'))
    print(soup.select('#list-2 .element'))
    print(type(soup.select('ul')[0]))

    获取内容

    通过get_text()就可以获取文本内容

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</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">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    for li in soup.select('li'):
        print(li.get_text())

     

    获取属性

    或者属性的时候可以通过[属性名]或者attrs[属性名]

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</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">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    for ul in soup.select('ul'):
        print(ul['id'])    # 这两种方法相通都是获取id的
        print(ul.attrs['id'])

    总结

    推荐使用lxml解析库,必要时使用html.parser
    标签选择筛选功能弱但是速度快
    建议使用find()、find_all() 查询匹配单个结果或者多个结果
    如果对CSS选择器熟悉建议使用select()
    记住常用的获取属性和文本值的方法





  • 相关阅读:
    Net包管理NuGet(3)搭建私服及引用私服的包
    MyMql 下载以及配置
    Oracle 环境部署 以及数据库创建 ,用户新建和权限分配
    VUE.JS 环境配置
    .NET WEB API 简单搭建
    C# Timer 定时任务
    RemoTing 搭建简单实现
    MVC+EF三层+抽象工厂
    ASP.NET MVC SignalR 简单聊天推送笔记
    .net Mvc Dapper 方法封装
  • 原文地址:https://www.cnblogs.com/cjj-zyj/p/10044852.html
Copyright © 2020-2023  润新知