首页 > 其他 > 详细

BeautifulSoup补充

时间:2020-11-14 22:53:37      阅读:45      评论:0      收藏:0      [点我收藏+]
  • 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()

 

BeautifulSoup补充

原文:https://www.cnblogs.com/zq-zq/p/13974752.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!