记录关于BeautifulSoup使用的一些代码笔记
导入
from bs4 import BeautifulSoup
解析器
html lxml html5lib
实例化
本地文件
filename = open('file.html','r',encoding='utf-8')
soup = BeautifulSoup(filename,'lxml')
网页源代码
response = requests.get(url)
htmlname = response.text
soup = BeautifulSoup(htmlname,'lxml')
格式化输出
prettify()
单标签提取
soup.TagName
print(soup.a)
print(soup.div)
print(soup.li)
print(soup.ul)
soup.find()
仅提取标签内容时 soup.find('a') = soup.a
print(soup.find('a'))
print(soup.find('div'))
print(soup.find('li'))
print(soup.find('ul'))
当需要提取单一个标签属性时
print(soup.find('a',id = '百度')) # 提取第一个id属性等于‘百度’的a标签
print(soup.find('div',class_ = 'baidu')) # 提取第一个class属性等于‘baidu’的div标签
print(soup.find('li',attrs = {'class':'baidu'})) # 提取第一个class属性等于‘baidu’的li标签
print(soup.find('ul','baidu')) # 提取第一个属性等于‘baidu’的ul标签
大部分实践场景下都是 提取class和id 这两个属性
class因为与python内置参数冲突,因此需在后面加‘_’或使用attrs来表示
注意:案例中的 a div li ul皆可更换为其他标签
多标签提取
soup.find_all()
print(soup.find_all('a',id = '百度')) # 提取所有id属性等于‘百度’的a标签
print(soup.find_all('div',class_ = 'baidu')) # 提取所有class属性等于‘baidu’的div标签
print(soup.find_all('li',attrs = {'class':'baidu'})) # 提取所有class属性等于‘baidu’的li标签
print(soup.find_all('ul','baidu')) # 提取所有属性等于‘baidu’的ul标签
print(soup.find_all('a',id='baidu')[3]) # 提取所有id等于‘baidu’的a标签的第三个元素
print(soup.find_all({'a','div'})) # 提取所有a和div的标签
print(soup.find_all(re.compile('^a'))) # 使用正则表达式提取a开头的标签
soup.select()
类选择器:.(点)
print(soup.select('.name')) # 提取所有属性名为name的标签
id选择器:#
print(soup.select('#name')) # 提取所有id属性名为name的标签
标签选择器:Tag
print(soup.select('a')) # 提取所有a标签
注意:soup.select('a') = soup.find_all('a') 提取效果是一致的,只是选择器不一样而已
层级选择器:
单层:>
# 提取属性名为name下的div标签下的a标签下的li标签下的ul标签
print(soup.select('.name > div > a > li > ul'))
多层: (空格)
# 提取属性名为name下的div标签多层级下的ul标签
print(soup.select('.name > div ul'))
标签内容提取
content = soup.select('a')[3]
# 提取属性名称
for i in content:
print(i.name)
# 提取属性值
for i in content:
print(i['href'])
print(i['src'])
print(i['target'])
# 提取属性所有文本
for i in content:
print(i.text)
# 提取属性所有文本
for i in content:
print(i.get_text())
# 提取属性第一个文本
for i in content:
print(i.string)
其他方法
语法 | 意义 |
获取所有符合条件的祖先节点 | 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() |
参考文章: