Python网络爬虫 BeautifulSoup库的使用方法

Beautifulsoup库的基本组成元素和基本的API调用方法,需要注意的地方都在注释里了

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
def test_beautifulsoup():#测试BeautifulSoup
    try:
        r = requests.get("https://www.baidu.com", timeout=50)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup=BeautifulSoup(r.text,"html.parser")
        print(soup.prettify())
        print(BeautifulSoup("<head>data</head>","html.parser").prettify())#解析对象可以是标签形式组织的字符串,也可以是.html或.xml文件
    except requests.HTTPError as http_error:
        print( "HTTPError")

'''BeautifulSoup库基本元素
BeautifulSoup解析的是标签<>...</>组织的文件或字符串
tag:
    标签,对应html/xml文档中的<标签名>...</标签名>,通过soup.标签名获得,是Tag类型实例
name:
    标签名,tag.name
attrs:
    标签的属性,<标签名 属性1="",属性2="">...</标签名>,返回{属性-值}字典
string
    标签文本,<p>文本</p>,返回NavigableString类型的实例
comment:
    html注释
parent
    获得当前标签的父标签,soup.标签名.parent
'''
def try_bs4():#基本元素
    try:
        r = requests.get("https://www.baidu.com", timeout=50)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup=BeautifulSoup(r.text,"html.parser")
        print(soup.title)#获取html的名为title的标签,即<title>...</title>标签
        print(type(soup.title))
        '''soup.标签名返回的是Tag实例
        Tag是bs4库里定义的内部类
        下文的parent,name,attrs,string都是Tag类属性
        '''
        print(soup.a)#获取html的链接标签
        '''
        当html文档中存在多个相同的tag时,soup.tag名的方式只会返回第一次出现的tag
        '''
        print(soup.a.parent)#获取a标签的父标签
        print(soup.a.parent.name)#获取a标签的父标签的标签名
        print(soup.a.attrs)#a标签的属性-值组成的字典
        print(soup.a.attrs['class'])#获取a标签的class属性的值
        print(soup.a.string)#获取a标签的文本
    except requests.HTTPError:
        print( "HTTPError")

'''
标签和标签与标签之间的文本NavigableString都是可遍历节点
向下遍历----------------------------------------------
.contents
    将当前tag的所有儿子(仅当前节点的下一层标签,不再继续往下分解标签)节点tag存入列表
.children
    将当前tag的所有儿子节点tag封装成一个可迭代对象
.descendants
    将当前tag的所有子孙节点tag封装成一个可迭代对象,从儿子一直向下迭代
注意:标签与标签</tag1>str<tag2>之间,标签内部<tag1>str</tag1>的字符串,也算其儿子节点
向上遍历------------------------------------------
.parent
    当前tag的父亲标签,返回类型即Tag
.parents:
    当前tag祖先标签的可迭代对象
注意:soup.parent=None
平行遍历------------------------------------
.next_sibling:
    同层下一个兄弟tag
.previous_sibling:
    同层上一个兄弟tag
.next_siblings:
    同层后续的所有兄弟tag组成的可迭代对象
.previous_siblings:
    同层前续的所有兄弟tag组成的可迭代对象
注意:标签与标签</tag1>str<tag2>之间,标签内部<tag1>str</tag1>的字符串NavigableString也算一个节点,在next_sibling中也会被获取
'''
def travel_html():#遍历HTML文档
    try:
        r = requests.get("https://www.baidu.com", timeout=50)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup=BeautifulSoup(r.text,"html.parser")
        #print(soup.prettify())
        print("-----------------------------------------------")
        #向下遍历
        print(soup.body.contents)  # 获取body标签的儿子标签组成的列表
        print(soup.body.contents[1].name)
        #for child in soup.body.children:#儿子tag可迭代对象
            #print(child)
        #for des in soup.body.descendants:#子孙tag可迭代对象
            #print(des)
        #向上遍历
        print(soup.body.parent.name)#body标签的父亲标签的名字:html#定义soup.parent=None
        #只能亲兄弟之间平行遍历
        print(soup.a.next_sibling)#是标签与标签之间的文本NavigableString' '
        print(soup.a.next_sibling.next_sibling)#才是真正的下一个标签
        #for silbs in soup.a.next_siblings:  #迭代后续兄弟节点
            #print(silbs)
    except requests.HTTPError:
        print( "HTTPError")

'''
BeautifulSoup库查找搜索Html
Tag实例(如soup).find_all(标签名name,属性值attrs,recursive,text)
返回:查找到的标签Tag实例组成的列表
参数1:给出要查找的标签名,字符串或者字符串组成的列表["name1","name2"...]
参数2:对标签属性值的检索,字典{属性,值}或字符串"值",返回含有该属性-值的标签
参数3:是否搜索当前节点的后续所有子孙节点,默认True
参数4:text,检索标签之间的字符串文本
                
                
                此外函数find()与find_all()用法相同,但find()只返回找到的一个结果,字符串类型
'''
def find_soup():
    try:
        r = requests.get("https://www.baidu.com", timeout=50)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup=BeautifulSoup(r.text,"html.parser")
        print(soup.find_all(['a','p']))#获取所有a标签和p标签
        print(soup.find_all(attrs="lb")) # 获取所有含有"lb"这一属性值的标签
        print(soup.find_all(['a', 'p'],{"class","bri"}))#获取所有class属性的值是“bri”的a和p标签
        print(soup.find_all(['a'], text="hao123"))  # 获取所有标签文本是"hao123"的a标签
    except requests.HTTPError:
        print("HTTPError")



if __name__=="__main__":
    test_beautifulsoup()
    try_bs4()
    travel_html()
发布了17 篇原创文章 · 获赞 7 · 访问量 7099

猜你喜欢

转载自blog.csdn.net/hrwy2920566283/article/details/103713958