html测试脚本:
<!DOCTYPE html>
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="content-type"/>
<meta content="IE=Edge" http-equiv="x-UA-Compatible"/>
<meta content="always" name="referrer"/>
<link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
<title>百度一下·你就道</title>
</head>
<body Link="#0000cc">
<div id="wrapper">
<div id="head">
<div class="head_wrapper">
<div id="u1">
<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新wen--></a>
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新阀</a>
<a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>
<a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>
<a class="mnav" href="http://v.baidu.com" name="tj_trvideo">规频</a>
<a class="mnav" href="http://tieba.baidu.con" name="tj_trtieba">贴</a>
<a class="bri" href="//www.baidu.com/more/" name="tj_br1icon" styLe="...">更多产品</a>
</div>
</div>
</div>
</div>
</body>
</html>
基本操作解析脚本:
'''
BeautifulSoup4将复杂html文档转换成一个复杂的树形结构,每个节点都是python对象,所以对象都可以归纳为4种
-Tag
-NavigableString
-BeautifulSoup
-Comment
'''
from bs4 import BeautifulSoup
file = open("./baidu.html","rb")
html = file.read()
bs = BeautifulSoup(html,"html.parser")
#1.Tag 标签及其内容(只能拿到第一个内容)
print(bs.title)
##<title>百度一下·你就道</title>##
#2.NavigableString 标签里的字符串
print(bs.title.string)
##百度一下·你就道##
print(bs.a.attrs)
##{'class': ['mnav'], 'href': 'http://news.baidu.com', 'name': 'tj_trnews'}##
#3.BeautifulSoup 整个文档输出
print(bs)
#4.Comment 是一个特殊的NavigableString类型,不包含注释符号
print(bs.a.string)
##新wen##
'''
<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新wen--></a>
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新阀</a>
'''
BeautifulSoup4文档搜索和文档遍历:
'''
BeautifulSoup4将复杂html文档转换成一个复杂的树形结构,每个节点都是python对象,所以对象都可以归纳为4种
-Tag
-NavigableString
-BeautifulSoup
-Comment
'''
import re
from bs4 import BeautifulSoup
file = open("./baidu.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")
#文档遍历 更多遍历内容搜索文档
#print(bs.head.contents)
#print(bs.head.contents[1])
##<meta content="text/html;charset=utf-8" http-equiv="content-type"/>##
#文档搜索
############################################ find_all() ################################################
#finde_all()查找所有 字符串过滤,查找与字符串完全一致的内容
# t_list = bs.find_all("a")
# print(t_list)
'''
[<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新wen--></a>,
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新阀</a>,
<a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>,
<a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>,
<a class="mnav" href="http://v.baidu.com" name="tj_trvideo">规频</a>,
<a class="mnav" href="http://tieba.baidu.con" name="tj_trtieba">贴</a>,
<a class="bri" href="//www.baidu.com/more/" name="tj_br1icon" style="...">更多产品</a>]
'''
import re
#正则表达式,使用search()方法
#正则表达式匹配 凡是含有a的内容都会返回
# t_list = bs.find_all(re.compile("a"))
# print(t_list)
#方法 传入一个函数(),根据函数要求搜索
# def namests(tag):
# return tag.has_attr("name")
# #包含函数中所指定的必须有name 的内容才会输出
# t_list = bs.find_all(namests)
# print(t_list)
'''
[<meta content="always" name="referrer"/>,
<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新wen--></a>,
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新阀</a>,
<a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>,
<a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>,
<a class="mnav" href="http://v.baidu.com" name="tj_trvideo">规频</a>,
<a class="mnav" href="http://tieba.baidu.con" name="tj_trtieba">贴</a>,
<a class="bri" href="//www.baidu.com/more/" name="tj_br1icon" style="...">更多产品</a>]
'''
############################################ kwargs 参数 ################################################
# t_list = bs.find_all(id="head") #herf="http://news.bidu.com"
# print(t_list)
############################################ string 参数 ################################################
# t_list = bs.find_all(string = "hao123")
'''
t_list = bs.find_all(string = ["hao123","地图"]) #可以将参数放进list,多参数获取
t_list = bs.find_all(string = re.compile("\d") #正则表达式获取带有数字的内容
'''
# print(t_list)
############################################ string 参数 ################################################
# t_list = bs.find_all("a",limit=3) ##限定获取内容的条数
#
# print(t_list)
############################################ css选择器 ################################################
# print(bs.select("title")) #通过标签查找
# print(bs.select(".mnav")) #通过类名查找
# print(bs.select("#u1")) #通过id查找
# print(bs.select("a[class='bri']"))#通过属性查找
# print(bs.select("#u1 > .bri"))#通过子标签查找
# t_list =bs.select(".mnav ~ .bri")#通过兄弟标签查找
# print(t_list[0].get_text())