美文网首页
Beautiful Soup使用

Beautiful Soup使用

作者: 中华小强仔 | 来源:发表于2018-08-06 18:06 被阅读0次

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会查询与字符串完整匹配的内容;

# 查询标签名称为<p></p>标签的元素列表
soup.find_all('p')

B.正则

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

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

C.列表

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

# 查询html中标签名称为<p></p>或者<b></b>的元素
soup.find_all(["p", "b"])

2) keyword参数

# 查询<p></p>标签对象的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')
    # 结果-->[<title>The Dormouse's story</title>]

(2)通过类选择器查找

soup.select('.title')
# 结果-->[<p class="title" name="dromouse"><b>The Dormouse's story</b></p>]

(3)通过id选择器查询

soup.select('#link1')
# 结果-->[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

(4)层级选择器查询

soup.select('p #link1')
# 结果-->[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

(5)通过属性选择器

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

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

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

(7)获取属性

# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')  
# 打印<a></a>标签的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))

打印结果

<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.BeautifulSoup'>
<class 'bs4.element.Comment'>

3.遍历文档树


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

3.1.1 .content

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

# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')
# 把soup对象中第一个<p></p>标签的子节点以列表形式输出
print(soup.p.contents)

输出结果

[<b>The Dormouse's story</b>, <a>3</a>]

3.1.2.children

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

soup.p.children
<list_iterator object at 0x000002ADD46B95F8>

相关文章

网友评论

      本文标题:Beautiful Soup使用

      本文链接:https://www.haomeiwen.com/subject/qrigvftx.html