BeautifulSoup用于html文件解析

 BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

测试文件:baidu.html

请将文件内容放于项目的根目录下

文件内容




	
	
	
	
	百度一下,你就知道


	


文件在浏览器中打开的截图:

 化html文件为树形结构bs

1.Tag        标签及其内容:拿到它所找到的第一个内容

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.title)

百度一下,你就知道

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.a)

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.head)






百度一下,你就知道

类型

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(type(bs.head))

2.NavigableString        标签里面的内容(字符串)

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.title)

print(bs.title.string)

print(type(bs.title.string))

百度一下,你就知道
百度一下,你就知道

拿到一个标签里面所有的属性(字典)

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.a.attrs)

{'class': ['mnav'], 'href': 'http://news.baidu.com', 'name': 'tj_trnews'}

3.BeautifulSoup        表示整个文档

类型

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(type(bs))

名字

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.name)

[document]

树形文档

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs)








百度一下,你就知道




 4.Comment        是一个特殊的NacigableString,输出的内容不包含注释符号

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.a.string)
print(type(bs.a.string))

新闻

文档的遍历

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.head.contents)

['\n', , '\n', , '\n', , '\n', , '\n', 百度一下,你就知道, '\n']

得到列表,可以用下标来访问相关的元素

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

print(bs.head.contents[1])

遍历文档树

  • 5.1 .contents:获取Tag的所有子节点,返回一个list
# tag的.content属性可以将tag的子节点以列表的方式输出
print(bs.head.contents)
#用列表索引来获取它的某一个元素
print(bs.head.contents[1])

  • 5.2 .children:获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
    print(child)

  • 5.3、.descendants:获取Tag的所有子孙节点
  • 5.4、.strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历
  • 5.5、.stripped_strings: 与strings用法一致,只不过可以去除掉那些多余的空白内容
  • 5.6、.parent:获取Tag的父节点
  • 5.7、.parents:递归得到父辈元素的所有节点,返回一个生成器
  • 5.8、.previous_sibling: 获取当前Tag的上一T个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符
  • 5.9、.next_sibling: 获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符
  • 5.10、.previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器
  • 5.11、.next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器
  • 5.12、.previous_element:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling相同,但通常是不一样的
  • 5.13、.next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,但通常是不一样的
  • 5.14、.previous_elements:返回一个生成器,可以向前访问文档的解析内容
  • 5.15、.next_elements:返回一个生成器,可以向后访问文档的解析内容
  • 5.16、.has_attr:判断Tag是否包含属性

文档的搜索

(1)find_all()        字符串过滤:会查找与字符串完全匹配的内容

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
#找到所有a标签的链接,放到一个列表里面
t_list=bs.find_all("a")
print(t_list)

[, 新闻, hao123, 地图, 视频, 贴吧, 更多产品

正则表达式搜索:使用search()方法来匹配内容

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
import re
t_list=bs.find_all(re.compile("a"))    #包含a的所有内容
print(t_list)

[




百度一下,你就知道
, , , , , 新闻, hao123, 地图, 视频, 贴吧, 更多产品]

方法:传入一个函数(方法),根据函数的要求来搜索(了解)

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
def name_is_exists(tag):
    return tag.has_attr("name")    #需要有name的标签的
t_list=bs.find_all(name_is_exists)

print(t_list)

[, , 新闻, hao123, 地图, 视频, 贴吧, 更多产品]

打印列表的方式

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
def name_is_exists(tag):
    return tag.has_attr("name")
t_list=bs.find_all(name_is_exists)

#print(t_list)
for item in t_list:
    print(item)



新闻
hao123
地图
视频
贴吧
更多产品

(2)kwargs 参数

我想找到id="head"的内容

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
t_list=bs.find_all(id="head")

for item in t_list:
    print(item)

我想找到含有class类的内容

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
t_list=bs.find_all(class_=True)

for item in t_list:
    print(item)



新闻
hao123
地图
视频
贴吧
更多产品

我想找到含有href="http://news.baidu.com"的内容

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
t_list=bs.find_all(href="http://news.baidu.com")

for item in t_list:
    print(item)


新闻

 (3)text参数(文本参数)

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

#文档的搜索
t_list=bs.find_all(text="hao123")

for item in t_list:
    print(item)

hao123

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.find_all(text=["hao123","地图","贴吧"])

for item in t_list:
    print(item)

hao123
地图
贴吧

 应用正则表达式来查找包含特定文本的内容(标签里的字符串)

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

import re
#应用正则表达式来查找包含特定文本的内容(标签里的字符串)
t_list=bs.find_all(text=re.compile("\d"))   #\d表示数字

for item in t_list:
    print(item)

hao123

限制查找个数

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.find_all("a",limit=3)

for item in t_list:
    print(item)


新闻
hao123

css选择器

通过标签来查找

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.select('title')   #通过标签来查找

for item in t_list:
    print(item)

百度一下,你就知道 

通过类名来查找

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.select(".mnav")   #通过标签来查找

for item in t_list:
    print(item)


新闻
hao123
地图
视频
贴吧

通过id来查找

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.select("#u1")   #通过id来查找

for item in t_list:
    print(item)

通过属性来查找

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.select("a[class='bri']")   #通过属性来查找

for item in t_list:
    print(item)

更多产品

通过子标签来查找

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.select("head>title")   #通过子标签来查找

for item in t_list:
    print(item)

百度一下,你就知道

通过兄弟标签来查找

from bs4 import BeautifulSoup

file=open("./baidu.html","rb")   #以二进制方式打开文档
html=file.read().decode("utf-8")    #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器

t_list=bs.select(".mnav ~ .bri")   #通过兄弟标签来查找

print(t_list[0].get_text())

 更多产品

BeautifulSoup用于html文件解析_第1张图片 

你可能感兴趣的:(Python,html,前端,css)