beautifulsoup学习记录

发布时间 2023-08-01 17:42:48作者: loxiao123

BeautifulSoup库总结

1、BeautifulSoup库作用

2、BeautifulSoup()方法

3、find()、find_all()、selector()、get()方法



1、BeautifulSoup库作用


  • 用于将爬取到的网页源码(用requests库完成)解析为soup文档,这样做的好处是可以再用BeautifulSoup库中的过滤函数(方法)过滤提取数据

2、BeautifulSoup()方法

  • 基本用法:

    from bs4 import BeautifulSouop

    soup = BeautifulSoup(res.text,'html.parser')

    这里res是用request的get方法得到的数据,这里暂时省略。


    print(soup.prettify())


    BeautifulSoup方法将res.text(注意要是text格式)解析成标准的html缩进格式数据放入变量'soup'中,这时'soup'是一个soup对象,可以使用BeautifulSoup库的其他方法来提取想要的内容具体看下面的方法。

    BeautifulSoup支持的解析器如下:
    解析器名 使用方法 优点 缺点
    Python标准库 BeautifulSoup(markup,"html.parser") Python内置,速度适中,文档容错能力强 旧版本存在容错能力差的情况
    lxml HTML解析器 BeautifulSoup(markup,"lxml") 速度快,文档容错能力强;(推荐) 需要安装C库
    Lxml XML解析器 BeautifulSoup(markup,"xml") 速度快,唯一支持XML的解析器 同上
    html5lib BeautifulSoup(markup,"html5lib") 容错性最好,以浏览器方式解析文档,生成HTML5格式的文档 速度慢

3、find()、find_all()、selector()、get()方法


  • find_all()方法




    soup.find_all('div',"item")

    查找div标签,class = "item"


    soup.find_all('div',class = 'item') #结果和前一句一样
    soup.find_all('div',attrs = {"class":"item"}) #attrs参数定义一个字典参数来搜索包含特殊属性的tag

    find_all()方法搜索当前soup对象的所有tag子节点(soup对象就是由各种html节点构成的)并判断是否符合过滤器的条件:
    find_all(name,attrs/class,recursive,string,**kwargs)
    name参数可以查找所有标签名为name的tag

    1、字符串对象自动忽略掉

    例:soup.find_all("title")


    1.2、多标签搜索

    例:soup.find_all(name = ['div','p'])



    2、基于标签属性查找如:attrs/class_/id/title/...


    2.1、通用方式属性搜索——attrs

    soup.find_all(attrs = {'data-custom':'custom'})


    2.2、css类名搜索——class_ (注意下划线)

    通过class_参数搜索由指定css类名的tag(可简写):

    soup.find_all("a","sister")#class_ = "sister"



    若tag的class属性是多值属性,按照css类名搜索tag时,可以分别搜索tag中的每个css类名:

    例如:

    CSS_soup = BeautifulSoup('<p class = "body strikeout">

    ')


    CSS_soup.find_all("p",class_ = "strikeout") #<p class = "body strikeout">




    CSS_soup.find_all("p",class_ = "body")




    也可以通过CSS值完全匹配来查找




    3、string


    3.1、搜索文档中的字符串内容,string参数接受字符串,正则表达式,列表,True。



    3.2、与其他参数混合过滤

    soup.find_all("a",string = "Else")

    soup的内容为:[<a href = "http..." class = "sister">Else]





    4、限定直接子节点——recursive

    加入参数recursive = False 则会只搜索tag的直接子节点


  • selector方法

    soup.select('div.item > a > h1')

    要加单引号,括号内容可以通过浏览器复制得到(鼠标右键目标内容然后点击copy selector


    !!!li:nth-child(1)需要改为li:nth-of-type(1)

    需要注意这种方法得到的结果是会带有标签的,使用get_text()方法即可获得其中的文本内容
    即在使用完select后再soup2 = soup.get_text().strip()

    补充:
    strip()函数是用于移除字符串开头和末尾的指定字符(默认为空格)或字符序列的方法。下面是使用strip()函数的基本语法:

    string.strip([characters])
    其中,string是要操作的字符串,characters是可选参数,用于指定要移除的字符或字符序列。

    下面是一些示例:

    移除字符串开头和末尾的空格:


    s = " Hello, World! "

    print(s.strip()) # 输出: "Hello, World!"

    移除字符串开头和末尾的指定字符:

    s = "Hello, World!"

    print(s.strip("*")) # 输出: "Hello, World!"

    移除字符串开头和末尾的多个指定字符序列:

    s = "~Hello,World~~~"

    print(s.strip("~")) # 输出: "Hello, World!"

    需要注意的是,strip()函数返回一个新的字符串,并不会修改原始字符串。如果想要移除字符串中间的字符,可以考虑使用其他字符串处理方法,比如replace()函数或正则表达式等。




  • get()方法





    BeautifulSoup解析得到的soup对象有一个get()方法。该方法用于获取标签(HTML元素)的属性值。
    使用get()方法时,你需要传递属性名作为参数。如果该属性存在,get()方法将返回对应的属性值;如果属性不存在,get()方法可以返回默认值(可选参数)或者None。





    注意区分字典、requests库和beautifulsoup库中的get方法,它们的作用分别是取键值、向网址请求获取网页资源、获取属性值。