• Beautiful Soup4语法讲解使用


    Beautiful Soup4提取HTML内容,一般要经过两步:首先处理源代码生成BeautifulSoup对象。然后使用find_all()或者find()来查找内容。

    目录

    页面示例

    1.解析源代码

    2.查找内容


    页面示例

    打开BS4练习页面,网页的源代码如图所示,直接使用requests获取源代码。

    1.解析源代码

    读取文件内容

    1. def mo_ni_html(file_name):
    2. """ 模拟获取网页 """
    3. with open(file_name, 'r', encoding='utf-8') as f:
    4. detail = f.readlines()
    5. content = ''
    6. content = content.join(detail)
    7. return content

    解析源代码生成BeautifulSoup对象,使用以下代码:

    soup = BeautifulSoup('网页源代码', '解析器')

    这里的“解析器”,可以使用html.parser:

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

    如果安装了lxml,还可以使用lxml:

    soup = BeautifulSoup(html, 'lxml')

    2.查找内容

    查找内容的基本流程和使用XPath非常相似。

    首先要找到包含特殊属性值的标签,并使用这个标签来寻找内容。

    假设需要获取“列表”,由于这个信息所在

    标签的class属性的值为“news-title”,

    这个值本身就很特殊,因此可以直接通过这个值来进行定位,如图所示。

    运行结果如上图所示。

    由于HTML中的class属性与Python的class关键字相同,因此为了不产生冲突,

    BS4规定,如果遇到要查询class的情况,使用“class_”来代替。

    在第20行的查询HTML代码中,class属性的属性值为“news-title”的标签,

    得到find()方法返回的BeautifulSoup Tag对象。

    在第22行中,直接通过.string属性就可以读出标签中的文字信息。

    那如果要获取“图集1”“图集2”和“图集3”,又应该怎么办呢?使用先抓大再抓小:

    1. videos_listb = soup.find(class_='videos-listb')
    2. ul_h2s = videos_listb.find_all('h2')
    3. for item in ul_h2s:
    4. print(item.string)

    运行结果如下:

    首先根据标签

    查找到有用的内容,

    然后在这个内容的基础上继续查找

    标签下面的内容。

    这里用到了find()方法和find_all()方法。

    find()与find_all()的不同点如下。

    · find_all()返回的是BeautifulSoup Tag对象组成的列表,

    如果没有找到任何满足要求的标签,就会返回空列表。

    · find()返回的是一个BeautifulSoup Tag对象,如果有多个符合条件的HTML标签,

    则返回第1个对象,如果找不到就会返回None。

    find_all()与find()的参数完全相同,以find_all()为例来说明。

    find_all(name, attrs, recursive, text, **kwargs)

    · name就是HTML的标签名,类似于body、div、ul、li。

    · attrs参数的值是一个字典,字典的Key是属性名,字典的Value是属性值,例如

    attrs={'class': 'videos-listb'}

    这种写法,class就不需要加下划线。

    · recursive的值为True或者False,当它为False的时候,BS4不会搜索子标签。

    · text可以是一个字符串或者是正则表达式,用于搜索标签里面的文本信息,

    因此,要寻找所有以“图集”开头的信息,还可以使用下面的写法:

    1. content = soup.find_all(text=re.compile('图集'))
    2. for item in content:
    3. print(item.string)

    运算结果如图所示:

     

    使用re时要注意,记得引入三方库re

    import re

     除了获取标签里面的文本外,BS4也可以获取标签里面的属性值。

    如果想获取某个属性值,可以将BeautifulSoup Tag对象看成字典,将属性名当作Key,

    如图所示:

  • 相关阅读:
    质量平台-sonarlint-idea本地配置及使用技巧
    js数组、对象、字符串常用方法
    生产队有没有驴,我说的算
    【OpenDDS开发指南V3.20】第二章:入门
    JAVA-Map接口概述、常用方法、排序、Hashtable面试题
    帧同步相关总结
    快解析DDNS 无需公网ip 安全高效
    rust学习Cell、RefCell、OnceCell
    物联网AI MicroPython传感器学习 之 RGB三色灯
    从零开始C语言精讲篇7:数据的存储
  • 原文地址:https://blog.csdn.net/json_ligege/article/details/127403890