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()