赞
踩
一 点睛
Beautiful Soup为我们提供了一些查询方法,比如find_all()和find()等,调用它们,然后传入相应的参数,就可以灵活查询了。
find_all()
find_all,顾名思义,就是查询所有符合条件的元素。给它传入一些属性或文本,就可以得到符合条件的元素,它的功能十分强大。
它的API如下:
find_all(name , attrs , recursive , text , **kwargs)
二 name
1 根据节点名查询元素
1.1 代码
- html='''
- <div class="panel">
- <div class="panel-heading">
- <h4>Hello</h4>
- </div>
- <div class="panel-body">
- <ul class="list" id="list-1">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
- <ul class="list list-small" id="list-2">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- </ul>
- </div>
- </div>
- '''
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, 'lxml')
- print(soup.find_all(name='ul'))
- print(type(soup.find_all(name='ul')[0]))
1.2 结果
- E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
- [<ul class="list" id="list-1">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>, <ul class="list list-small" id="list-2">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- </ul>]
- <class 'bs4.element.Tag'>
1.3 说明
这里我们调用了find_all()方法,传入name参数,其参数值为ul。也就是说,我们想要查询所有ul节点,返回结果是列表类型,长度为2,每个元素依然都是bs4.element.Tag类型。
2 嵌套查询
2.1 代码
- html='''
- <div class="panel">
- <div class="panel-heading">
- <h4>Hello</h4>
- </div>
- <div class="panel-body">
- <ul class="list" id="list-1">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
- <ul class="list list-small" id="list-2">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- </ul>
- </div>
- </div>
- '''
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, 'lxml')
-
- for ul in soup.find_all(name='ul'):
- print(ul.find_all(name='li'))
2.2 结果
- E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
- [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
- [<li class="element">Foo</li>, <li class="element">Bar</li>]
2.3 说明
返回结果是列表类型,列表中的每个元素依然还是Tag类型。
3 获取文本
3.1 代码
- html='''
- <div class="panel">
- <div class="panel-heading">
- <h4>Hello</h4>
- </div>
- <div class="panel-body">
- <ul class="list" id="list-1">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
- <ul class="list list-small" id="list-2">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- </ul>
- </div>
- </div>
- '''
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, 'lxml')
-
- for ul in soup.find_all(name='ul'):
- print(ul.find_all(name='li'))
- for li in ul.find_all(name='li'):
- print(li.string)
3.2 结果
- E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
- [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
- Foo
- Bar
- Jay
- [<li class="element">Foo</li>, <li class="element">Bar</li>]
- Foo
- Bar
三 attrs
1 属性查询标准写法
1.1 代码
- html='''
- <div class="panel">
- <div class="panel-heading">
- <h4>Hello</h4>
- </div>
- <div class="panel-body">
- <ul class="list" id="list-1" name="elements">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
- <ul class="list list-small" id="list-2">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- </ul>
- </div>
- </div>
- '''
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, 'lxml')
- print(soup.find_all(attrs={'id': 'list-1'}))
- print(soup.find_all(attrs={'name': 'elements'}))
1.2 结果
- E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
- [<ul class="list" id="list-1" name="elements">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>]
- [<ul class="list" id="list-1" name="elements">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>]
1.3 说明
这里查询的时候传入的是attrs参数,参数的类型是字典类型。比如,要查询id为list-1的节点,可以传入attrs={'id': 'list-1'}的查询条件,得到的结果是列表形式,包含的内容就是符合id为list-1的所有节点。在上面的例子中,符合条件的元素个数是1,所以结果是长度为1的列表。
2 属性查询简单写法
2.1 代码
- html='''
- <div class="panel">
- <div class="panel-heading">
- <h4>Hello</h4>
- </div>
- <div class="panel-body">
- <ul class="list" id="list-1" name="elements">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
- <ul class="list list-small" id="list-2">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- </ul>
- </div>
- </div>
- '''
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, 'lxml')
- # 对于一些常用的属性,比如id和class等,我们可以不用attrs来传递。
- # 比如,要查询id为list-1的节点,可以直接传入id这个参数。
- print(soup.find_all(id='list-1'))
- print(soup.find_all(class_='element'))
2.2 结果
- E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
- [<ul class="list" id="list-1" name="elements">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>]
- [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>, <li class="element">Foo</li>, <li class="element">Bar</li>]
2.3 说明
这里直接传入id='list-1',就可以查询id为list-1的节点元素了。而对于class来说,由于class在Python里是一个关键字,所以后面需要加一个下划线,即class_='element',返回的结果依然还是Tag组成的列表。
四 text
1 点睛
text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象。
2 代码
- import re
- html='''
- <div class="panel">
- <div class="panel-body">
- <a>Hello, this is a link</a>
- <a>Hello, this is a link, too</a>
- </div>
- </div>
- '''
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, 'lxml')
- print(soup.find_all(text=re.compile('link')))
3 结果
- E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
- ['Hello, this is a link', 'Hello, this is a link, too']
4 说明
这里有两个a节点,其内部包含文本信息。这里在find_all()方法中传入text参数,该参数为正则表达式对象,结果返回所有匹配正则表达式的节点文本组成的列表。
五 find()函数
1 点睛
除了find_all()方法,还有find()方法,只不过后者返回的是单个元素,也就是第一个匹配的元素,而前者返回的是所有匹配的元素组成的列表。
2 代码
- html='''
- <div class="panel">
- <div class="panel-heading">
- <h4>Hello</h4>
- </div>
- <div class="panel-body">
- <ul class="list" id="list-1">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
- <ul class="list list-small" id="list-2">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- </ul>
- </div>
- </div>
- '''
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(html, 'lxml')
- print(soup.find(name='ul'))
- print(type(soup.find(name='ul')))
- print(soup.find(class_='list'))
3 结果
- E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
- <ul class="list" id="list-1">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
- <class 'bs4.element.Tag'>
- <ul class="list" id="list-1">
- <li class="element">Foo</li>
- <li class="element">Bar</li>
- <li class="element">Jay</li>
- </ul>
4 说明
这里的返回结果不再是列表形式,而是第一个匹配的节点元素,类型依然是Tag类型。
六 其他函数
另外,还有许多查询方法,其用法与前面介绍的find_all()、find()方法完全相同,只不过查询范围不同,这里简单说明一下。
find_parents()和find_parent():前者返回所有祖先节点,后者返回直接父节点。
find_next_siblings()和find_next_sibling():前者返回后面所有的兄弟节点,后者返回后面第一个兄弟节点。
find_previous_siblings()和find_previous_sibling():前者返回前面所有的兄弟节点,后者返回前面第一个兄弟节点。
find_all_next()和find_next():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
find_all_previous()和find_previous():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。