BeautifulSoup 自用笔记

记录关于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标签

大部分实践场景下都是 提取classid 这两个属性

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()

参考文章:

Python爬虫快速入门,BeautifulSoup基本使用及实践

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inganxu

感谢您的支持!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值