Beautiful Soup使用

Beautiful Soup使用


Beautiful Soup官方文档是一个HTML/XML的解析器,主要的功能是如何解析和提取HTML/XML数据;
lxml只会局部遍历,而Beautiful Soup是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此解析时间和内存开销都会大很多,所以性能要低于lxml;
BeautifulSoup用来解析 HTML比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxmlXML解析器;

安装

pip install beautifulsoup4

1.语法


创建soup对象
    from bs4 import BeautifulSoup
    # html为解析文本, 'lxml'指定解析器
    soup = BeautifulSoup(html, 'lxml')
    # 格式化输出 soup 对象的内容
    print(soup.prettify())

一、find_all()使用

参数: find_all(name, attrs, recursive, text, **kwargs)**

1)name参数

name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉

A.字符串

最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,Beautiful Soup会查询与字符串完整匹配的内容;

# 查询标签名称为

标签的元素列表 soup.find_all('p')

B.正则

如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和标签都应该被找到

soup.find_all(re.compile(r'^b'))

C.列表

如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回

# 查询html中标签名称为

或者的元素 soup.find_all(["p", "b"])

2) keyword参数

# 查询

标签对象的class属性是title的元素 soup.find_all('p',attrs={'class':'title'})

3)text参数

通过 text 参数可以搜索文档中的字符串内容,与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表

soup.find_all(text="Elsie")

soup.find_all(text=["Tillie", "Elsie", "Lacie"])

soup.find_all(text=re.compile("Dormouse"))

二、find使用

find的用法与find_all一样,区别在于find返回 第一个符合匹配结果,find_all则返回 所有匹配结果的列表

三、 CSS选择器

CSS选择器与 find_all 方法有异曲同工之妙的查找方法,也是返回所有匹配结果的列表。

  • 写 CSS 时,标签名不加任何修饰,类名前加.,id名前加#
  • 在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list

(1)通过标签选择器查找

    soup.select('title')
    # 结果-->[The Dormouse's story]

(2)通过类选择器查找

soup.select('.title')
# 结果-->[

The Dormouse's story

]

(3)通过id选择器查询

soup.select('#link1')
# 结果-->[]

(4)层级选择器查询

soup.select('p #link1')
# 结果-->[]

(5)通过属性选择器

soup.select("a[class='sister']")

(6)get_text()获取文本内容

以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容

(7)获取属性

# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')  
# 打印标签的href属性
print(soup.select('a')[0].get('href'))
print(soup.find('a').get('href'))
print(soup.find_all('a')[0].get('href'))
print(soup.find('p').get('name'))
# 打印结果
http://example.com/elsie
http://example.com/elsie
http://example.com/elsie
dromouse

2. bs4的四大对象


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

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

代码展示

# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')
# 打印获取的对象类型
print(type(soup.a))
print(type(soup.p.string))
print(type(soup))
print(type(soup.a.string))

打印结果





3.遍历文档树


3.1 获取子节点:.contents,.children属性

3.1.1 .content

tag的.content属性可以将tag的子节点以列表方式输出

# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')
# 把soup对象中第一个

标签的子节点以列表形式输出 print(soup.p.contents)

输出结果

[The Dormouse's story, 3]

3.1.2.children

它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。
我们打印输出 .children 看一下,可以发现它是一个 list 生成器对象

soup.p.children

你可能感兴趣的:(Beautiful Soup使用)