BeautifulSoup

  • BeautifulSoup 将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种,下面使用的 bs 是 bs = bf(html, "html.parser")
    • Tag: 标签及其内容,只能拿到它所找到的第一个标签块 如:print(bs.title)
    • NavigableString:标签里的内容,就是字符串 如:print(bs.title.string)
    • BeautifulSoup:表示整个文档 如:print(bs)
    • Comment:是一个特殊的NavigableString,输出的内容不包含注释符号

 

# -*- coding = utf-8 -*-

import re
from bs4 import BeautifulSoup as bf


# 使用bs4读取html信息
def read_html_base():
    # 使用二进制打开html文件
    file = open('../Data/html/test.html', 'rb')
    html = file.read().decode('utf-8')

    # "html.parser"使用html格式解析
    bs = bf(html, "html.parser")

    # 获得html文件中的首个 <title></title> 标签
    print(bs.title)
    # 获得html文件中的首个 body.div.div中的 <div></div> 标签
    print(bs.body.div.div.div)

    # 获取第一个出现的 <title></title>中的文本内容
    print(bs.title.text)
    print(bs.title.string)

    # 获取第一个出现的标签的 属性字典
    print(bs.a.attrs)

    file.close()


# 文档的遍历
def read_html_traversal():
    file = open('../Data/html/test.html', 'rb')
    html = file.read().decode('utf-8')
    # "html.parser"使用html格式解析
    bs = bf(html, "html.parser")

    # 使用遍历,获得tag的所有子节点啊,返回一个list
    list_a = bs.body.div.div.div.contents
    for a in list_a:
        if(a.string == None):
            continue
        print(a.string, end=' ')

    file.close()


# 文档的搜索
def read_html_search():
    file = open('../Data/html/test.html', 'rb')
    html = file.read().decode('utf-8')
    # "html.parser"使用html格式解析
    bs = bf(html, "html.parser")
 

    # 1. 字符串过滤(精确查找): 会查找与字符串完全匹配的标签内容
    # 这里用 find_all(x) 查找所有的 x 标签模块
    f_list = bs.find_all('a')
    # f_list = bs.find_all('a', limit=2)
    # 遍历搜索的内容
    for a in f_list:
        # 打印标签中的内容
        print(a.string)
    # 自定义的分割线
    split(10)

    # 属性参数匹配(精确搜索), attribute='value'
    f_list = bs.find_all(target="_blank")
    # 遍历搜索的内容
    for a in f_list:
        # 打印标签中的内容
        print(a)
    split(10)

    # 文本参数匹配(精确搜索)
    # f_list = bs.find_all(text='腾讯')
    f_list = bs.find_all(text=['百度', '新浪'])
    for a in f_list:
        # 打印标签中的内容
        print(a)
    split(10)


    # 2. 正则表达式搜索(模糊查找): 使用search()方法来匹配内容, 不仅完全匹配标签, 部分匹配标签也算
    # 比如re.compile('a'), <a></a> 标签符合, <meta />, <head></head> 标签模块也符合
    # 正则表达式这里只简单举例, 后面还会具体说到
    f_list = bs.find_all(re.compile('a'))
    # 遍历搜索的内容
    for a in f_list:
        # 打印标签中的内容
        print(a)
    split(10)


    # 3.Css 选择器查找(精确查找), select('x') 标签查找, '.x' 类名查找, '#x' id查找
    # f_list = bs.select('.dr')
    # f_list = bs.select('#car')
    f_list = bs.select('a')
    for a in f_list:
        print(a)
    split(10)

    # 查找 body 的 div子标签 的 div子标签 的 div子标签
    f_list = bs.select("body > div > div > span > h3")
    for h in f_list:
        print(h)

    file.close()


# 以下split、main两个函数和 if __name__ 程序主入口是我个人编程习惯,与上述内容无本质关联
# 定义分隔线长度
def split(num):
    for i in range(1, num):
        print("------------", end='')
    print()


# 调用测试程序
def main():
    split(10)
    read_html_search()
    split(10)


# 主程序入口
if __name__ == '__main__':
    main()

 

posted @ 2020-11-14 21:16  a最简单  阅读(231)  评论(0编辑  收藏  举报