BeautifulSoup库的使用

本文介绍了一个灵活高效的Python网页解析库——BeautifulSoup。该库能够自动处理文档编码,并提供了多种方式来选择和处理HTML/XML文档中的元素。文章详细讲解了如何安装及使用BeautifulSoup进行网页数据抓取,包括创建对象、标签选择、获取属性、获取节点等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • 灵活方便的网页解析库,处理高效,支持多种解析器
  • 是python的一个库,通过解析文档为用户提供需要抓取的数据
  • 自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
  • 不用编写复杂的正则表达式提取网页信息(代替正则)

安装:

pip35 install beautifulsoup4

pip35 install lxml
# lxml解析器更加强大,速度更快

pip35 install html5lib
创建 Beautiful Soup 对象
soup = BeautifulSoup(html)
# 用本地HTML文件来创建对象
# soup = BeautifulSoup(open('demo.html'))
<!--打印soup对象的内容-->
print(soup.prettify())
<!--选择了title标签,将内容打印出来-->
print(soup.title.string)

常用的解析方法

标签选择器
选择元素
soup = BeautifulSoup(html, 'lxml')
<!--print(soup.prettify())-->
print(soup.title.string)
print(soup.title)
# 输出第一个返回结果
<!--获取名称-->
print(soup.p.string)

输出:

Title
<title>Title</title>
change the world by program
获取属性
soup = BeautifulSoup(html, 'lxml')
print(soup.p.attrs['name'])
print(soup.p['name'])

输出:

aaa
aaa
获取子节点
<!--获取p标签的子节点-->
<p class="story" name="aaa">change the world by program
    <a>aaaaaaaaaaaaaaaaaaa</a>
    <a>bbbbbbbbbbbbbbbbb</a>
    <a>ccccccccccccccccc</a>
</p>

<!--列表类型-->
soup = BeautifulSoup(html, 'lxml')
print(soup.p.contents)

输出:

['change the world by program\n    ', <a>aaaaaaaaaaaaaaaaaaa</a>, '\n', <a>bbbbbbbbbbbbbbbbb</a>, '\n', <a>ccccccccccccccccc</a>, '\n']

返回迭代器类型:

soup = BeautifulSoup(html, 'lxml')
print(soup.p.children)
for i, child in enumerate(soup.p.children):
    print(i, child)

输出:

0 change the world by program
1 <a>aaaaaaaaaaaaaaaaaaa</a>
2 
3 <a>bbbbbbbbbbbbbbbbb</a>
4 
5 <a>ccccccccccccccccc</a>
6

子孙节点

soup = BeautifulSoup(html, 'lxml')
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):
    print(i, child)

输出:

0 change the world by program
1 <a>aaaaaaaaaaaaaaaaaaa</a>
2 aaaaaaaaaaaaaaaaaaa
3 
4 <a>bbbbbbbbbbbbbbbbb</a>
5 bbbbbbbbbbbbbbbbb
6 
7 <a>ccccccccccccccccc</a>
8 ccccccccccccccccc
9
父节点和祖先节点

  • 父节点:parent
  • 祖先节点: parents
  • 兄弟节点:next_siblings
  • previous_siblings

标准选择器
html = '''
<div class="panel">
    <ul class="list" id="list1" name="elements">
        <li class="element">aaa</li>
        <li class="element">bbb</li>
        <li class="element">ccc</li>
    </ul>
    <ul class="list list-small" id="list2">
        <li class="element">111</li>
        <li class="element">222</li>
    </ul>
</div>
'''
name
soup = BeautifulSoup(html, 'lxml')
<!--注:ul必须与标签名一致-->
for ul in soup.find_all('ul'):
    print(ul.find_all('li'))

输出:

[<li class="element">aaa</li>, <li class="element">bbb</li>, <li class="element">ccc</li>]
[<li class="element">111</li>, <li class="element">222</li>]
attr

通过属性名获取元素:

print(soup.find_all(attrs={'id': 'list1'}))
print(soup.find_all(attrs={'name': 'elements'}))

输出:

[<ul class="list" id="list1" name="elements">
<li class="element">aaa</li>
<li class="element">bbb</li>
<li class="element">ccc</li>
</ul>]

也可以直接获取:

print(soup.find_all(id='list1'))
print(soup.find_all(class_='element'))
text
print(soup.find_all(text='111'))
find

返回单个元素,find_all返回所有元素

css选择器
print(soup.select('.panel #list1'))
<!--输出第一个ul-->
获取属性
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])
获取内容
for li in soup.select('li'):
    print(li.get_text())

输出:

aaa
bbb
ccc
111
222



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值