BeautifulSoup解析html - 简单的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
'''
    解析器:
        Python  内置标准库  优势:执行速度适中,文档容错能力强
            BeautifulSoup(html,'html.parser')  3.7 or 3.2 容错能力较差
        lxml HTML   速度快,文档容错能力强  (最常用)
            BeautifulSoup(html,'lxml')
        lxml XML    速度快 ,唯一支持xml解析
            BeautifulSoup(html,'xml')
        html5lib    最好的容错性,速度慢,不依赖外部扩展
            BeautifulSoup(html,'html5lib')
'''
import requests
from bs4 import BeautifulSoup
 
response = requests.get('https://book.douban.com/')
soup = BeautifulSoup(response.text, 'lxml')
# 格式化(自动补全没有闭合标签)
pret = soup.prettify()
# print(pret)
# 获取标签内容
print(soup.title.string.strip())  # soup.title.string  获取title标签的字符串
# 获取标签
print(soup.p)  # (多个p标签)输出第一个p标签
# 获取标签名称
print(soup.title.name)
# 获取属性2种方法
print(soup.p.attrs['name'])
print(soup.p['name'])
# 嵌套元素选择
print(soup.head.title.string)  # 获取head > title 的内容
# 获取子节点标签 2中方法
print(soup.p.contents)  # 返回list类型['<a>aaa</a>',....] 每个标签是一个元素
print(soup.p.children)  # 返回list_itrator 类型
# 获取子节点和孙节点
print(soup.p.descendants)  # 返回迭代器
# 获取父节点
print(soup.p.parent)
# 获取祖先节点
print(soup.p.parents)
# 获取兄弟节点
print(soup.p.next_siblings)  # 下一个
print(soup.p.previous_siblings)  # 上一个
 
# 标准选择器
# find_all(name,attr,recursive,text,**kwargs)
# name (标签名称)
print(soup.find_all('ul'))  # 所有的
print(soup.find_all('ul')[0])  # 取第一个
for ul in soup.find_all('ul'):
    print(ul.find_all('li')[0])  # 返回tag类型
# attrs {'id': 'id1'}  {'name': 'aaa'}
print(soup.find_all(attrs={'name': 'elem'})[0].string)  # 获取标签内容
 
# CSS 选择器 (select)
print(soup.select('.ccc .box')[0].string)  # 就是这么爽
# 获取属性
print(soup.select('.ccc .box')[0]['id'])
print(soup.select('.ccc .box')[0].attrs['id'])
# 获取内容
print(soup.select('.ccc .box')[0].get_text())
'''
    总结:
        推荐使用lxml解析库,必要时使用html.parser
        标签选择功能弱但是速度快
        建议使用find(),find_all() 查询单个,或者多个
        如果css选择器熟悉就用select()
        记住常用的属性和文本值获取方法
'''

  

posted @   qukaige  阅读(1325)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示