bs4
Tag
标签及其内容:拿到它所找到的第一个内容
from bs4 import BeautifulSoup
file = open('./baidu.html','rb')
html = file.read()
bs = BeautifulSoup(html,'html.parser')
#html.parser是一个html类型的解析器
print(bs.title)
print(bs.a)
print(type(bs.head))
#Tag 标签及其内容:拿到它所找到的第一个内容
运行结果
<title>百度一下,你就知道 </title>
<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
<class 'bs4.element.Tag'> #表示类型是tag
NavigableString
- 标签里的内容(字符串)
print(bs.title.string)
print(type(bs.title.string))
运行结果
百度一下,你就知道
<class 'bs4.element.NavigableString'>
- 标签里的内容(属性)
print(bs.a.attrs)
{'class': ['mnav'], 'href': 'http://news.baidu.com', 'name': 'tj_trnews'}
BeautifulSoup
表示整个文档
print(type(bs))
print(bs.name)
print(bs)
Comment
特殊的NavigableString,输出的内容不包含注释符号
使用方法
文档的遍历
#文档的遍历
print(bs.head.contents) #将tag的子节点以列表的方式输出
print(bs.head.contents[1]) #用列表索引来获取它的某一个元素
有更多方法,但使用效果不如文档的搜索
文档的搜索
- find_all()
- find_all()
把所有找出来的东西统一放进列表里
#字符串过滤:会查找与字符串完全匹配的内容
t_list = bs.find_all('a')
- 正则表达式
import re
t_list = bs.find_all(re.compile('a'))
#只要标签里含有a,就把这个标签及其里面所有内容找出来
- 方法
传入一个函数(方法),根据函数的要求来搜索`
def name_is_exists(tag):
return tag.has_attr('name')
t_list = bs.find_all(name_is_exists)
- kwarge 参数
t_list = bs.find_all(id='head') #指定参数
t_list = bs.find_all(class_=True)
for item in t_list:
print(item)
- text 参数
#t_list=bs.find_all(text='hao123')
t_list=bs.find_all(text=['hao123','地图','贴吧'])
for item in t_list:
print(item)
运行结果:
hao123
地图
贴吧
运用正则表达式
来查找包含特定文本的内容(标签里的字符串)
t_list = bs.find_all(text=re.compile('\d')) #查找包含数字的文本内容
for item in t_list:
print(item)
运行结果:
hao123 #包含数字的字符串
- limit 参数
限定直接获取到的个数
t_list = bs.find_all('a',limit=2)
运行结果:
- css 选择器
t_list = bs.select('title') #通过标签来查找
t_list = bs.select('.mnav') #通过类名来查找
t_list = bs.select('#u1') #通过id来查找
t_list = bs.select('a[class="bri"]') #通过属性来查找
t_list = bs.select("head>title") #通过子标签来查找
for item in t_list:
print(item)
t_list = bs.select(".mnav ~ .bri") #通过兄弟标签来查找
print(t_list[0].get_text())