BeautifulSoup4
将复杂的HTML
文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种
Tag
NavigableString
BeautifulSoup
Comment
全局代码
from bs4 import BeautifulSoup
file = open(r"D:\code2022\auto-work\douban\test\baidu.html","rb")
html = file.read().decode('utf-8')
bs = BeautifulSoup(html,"html.parser")
print(bs.title) # <title>百度一下,你就知道</title>
print(bs.a)
print(bs.head)
print(type(bs.head)) # <class 'bs4.element.Tag'>
Tag 标签及其内容
拿到它所找到的第一个内容
NavigableString
标签里的内容(字符串)
print(bs.title.string) # 百度一下,你就知道
print(type(bs.title.string)) # <class 'bs4.element.NavigableString'>
BeautifulSoup
表示整个文档
print(bs.a.attrs)
print(type(bs)) # <class 'bs4.BeautifulSoup'>
Comment
是一个特殊的NavigableString
,输出的内容不包含注释符号。
print(bs.name) # [document]
print(bs)
print(bs.a.string)
print(type(bs.a.string))
文档的遍历,遍历文档树。
print(bs.head.contents)
print(bs.head.contents[1])
# 更多内容,搜索文档。
文档的搜索
find_all()
# 字符串过滤:会查找与字符串完全匹配的内容
t_list = bs.find_all("a")
import re
# 正则表达式搜索:使用search() 方法来匹配内容
t_list = bs.find_all(re.compile("a"))
# 方法: 传入一个函数(方法),根据函数的要求来搜索(了解)
def name_is_exits(tag):
return tag.has_attr("name")
t_list = bs.find_all(name_is_exits)
for item in t_list:
print(item)
print(t_list)
kwargs 参数
t_list = bs.find_all(id="head")
t_list = bs.find_all(href="http://news.baidu.com")
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","地图","贴吧"])
t_list = bs.find_all(text=re.compile("\d")) # 应用正则表达式来查找包含特定文本的内容(标签里的字符串)
limit 参数
t_list = bs.find_all("a",limit=3)
for item in t_list:
print(item)
css 选择器
t_list = bs.select('title') # 通过标签来查找
for item in t_list:
print(item)
t_list = bs.select(".mnav") # 通过类名查找
for item in t_list:
print(item)
t_list = bs.select("#u1") # 通过id查找
for item in t_list:
print(item)
t_list = bs.select("a[class='guide-info']") # 通过属性来查找
for item in t_list:
print(item)
t_list = bs.select("head > title") # 通过子标签来查找
for item in t_list:
print(item)
t_list = bs.select(".mnav ~ .bri") # 查找mnav下的bri标签
print(t_list[0].get_text())
正则表达式与Re库
正则表达式常用操作符(1)
正则表达式常用操作符(2)
Re库主要功能函数
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位OR(|)
它们来指定。如re.l|re.M
被设置成|
和M
标志。
正则表达式:字符串模式(判断字符串是否符合一定的标准)
import re
# 创建模式对象
pat = re.compile("AA") # 此处的AA 是正则表达式,用来去验证其他字符串
m = pat.search("CBA") # search 字符串被校验的内容
m = pat.search("ABCAA")
print(m) # <re.Match object; span=(3, 5), match='AA'>
m = pat.search("ABCAADDCCAAA") # search 方法进行比对查找
print(m) # <re.Match object; span=(3, 5), match='AA'>
# 没有模式对象
m = re.search("asd","Aasd") # 前面的字符串是规则(模板),后面的字符串是被校验的对象。
print(m) # <re.Match object; span=(1, 4), match='asd'>
print(re.findall("a","ASDaDFGAa")) # ['a', 'a'] 前面字符串是规则(正则表达式),后面字符串是被校验的字符串
print(re.findall("[A-Z]","ASDaDFGAa")) # ['A', 'S', 'D', 'D', 'F', 'G', 'A']
print(re.findall("[A-Z]+","ASDaDFGAa")) # ['ASD', 'DFGA']
# sub
print(re.sub("a","A","abcdcasd")) # 找到a用A替换,在第三个字符串种查找
# 建议用正则表达式中,被比较的字符串前面加上r,不用担心转义字符的问题。
a = r"\aabd-\'"
print(a) # \aabd-\'
评论区