BeatifulSoup的使用

BeatifulSoup简介

灵活又方便的解析网页解析库,处理高效,支持多种解析器。

利用它不用编写正则表达式即可方便地实现网页信息的提取。

BeatifulSoup主要解析器

此图片不可显示

BeatifulSoup演示案例

aa.html

此图片不可显示

demo.py

此图片不可显示

BeatifulSoup4的四大种类

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

  • Tag

    通俗的讲就是HTML里的标签,可以利用soup加标签名轻松获得标签的内容,但是查找的内容是第一个符合要求的标签

    属性:name、attrs

  • NavigableString

    标签的文字部分的内容,用.string获取

  • BeautifulSoup

    表示一个文档的内容

  • Comment

    特殊类型的NavigableString 对象,其输出的内容不包括注释符号。

遍历文档树

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

搜索文档树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from bs4 import BeautifulSoup
import re
file = open('./aa.html','rb')
html = file.read()
bs = BeautifulSoup(html,'html.parser')
# name参数
a_list = bs.find_all("a")
print(a_list)

# 如果传入的是正则,则会根据search()来匹配内容
print("=================================================================================")
t_list = bs.find_all(re.compile("a"))
for item in t_list:
print(item)

# 如果是传入一个列表,将会与列表中的任意元素匹配到的结点返回
print("=================================================================================")
s_list = bs.find_all(["meta","link"])
for item in s_list:
print(item)


# 传入方法
print("==================================================================================")
def name_is_exists(tag):
return tag.has_attr("a")
f_list = bs.find_all(name_is_exists)
for item in file:
print(item)


# 传入kwargs参数
print("===================================================================================")
g_list = bs.find_all(id = "head")
print(g_list)

re_list = bs.find_all(href = "http://news.baidu.com")
print(re_list)

# 查询所有包含class的Tag
class_list = bs.find_all(class_ = True)
for item in class_list:
print(item)


# arrrs参数
# 对html的data_*属性进行搜索时,
data_list = bs.find_all(attrs={"data-foo":"value"})
print(data_list)

# text参数
text1_list = bs.find_all(text="hao123")
print(text1_list)

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

#搜索text的特殊场景时
def length_is_two(text):
return text and len(text) == 2

fun_list = bs.find_all(text=length_is_two)
print(fun_list)

# limit参数,限制返回的数量
limit_list = bs.find_all("a",limit=2)
print(limit_list)

css选择器

通过bs.select()方法选取具有对应样式的元素

各位看官,看完打赏一下~