首页 前端知识 利用BS4的select及find_all查找HTML常见的元素和属性

利用BS4的select及find_all查找HTML常见的元素和属性

2024-06-03 12:06:01 前端知识 前端哥 651 455 我要收藏

BeautifulSoup是一个用于Python的HTML和XML解析库。它可以帮助您轻松地从HTML和XML文档中提取数据,处理文档结构和解析标签。BeautifulSoup库的主要优点是它的易用性和简洁的API,使得处理复杂的HTML和XML文档变得简单。

from bs4 import BeautifulSoup
import requests

# 发送HTTP请求并获取HTML文档
response = requests.get("https://xxx.com")
html_doc = response.text

# 使用BeautifulSoup解析HTML文档
soup = BeautifulSoup(html_doc, "html.parser")

# 编译一个匹配电子邮件地址的正则表达式模式
email_pattern = re.compile(r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+")

# 使用find_all方法查找所有匹配电子邮件地址的a标签
email_tags = soup.find_all("a", href=email_pattern)

# 遍历结果并打印电子邮件地址
for tag in email_tags:
    email = tag.get("href")
    print(email)
select(selector) 方法是BeautifulSoup中一个强大的功能,它允许你使用CSS选择器来查找HTML元素。它接受一个CSS选择器作为参数,并返回一个生成器,包含匹配的标签。这个方法非常有用,因为它允许你使用熟悉的CSS语法来查找和操作HTML元素。

CSS选择器可以是元素选择器、类选择器、ID选择器、属性选择器等。以下是一些例子:

  • 元素选择器:选择具有指定标签名的所有元素。
from bs4 import BeautifulSoup
html = "<html><head><title>Hello</title></head><body><h1>Hello</h1><p>Hello</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')
tags = soup.select('h1')
print(tags)
  • 类选择器:选择具有指定类名的所有元素。
from bs4 import BeautifulSoup
html = "<html><head><title>Hello</title></head><body><h1 class='header'>Hello</h1><p class='content'>Hello</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')
tags = soup.select('.header')
print(tags)
  • ID选择器:选择具有指定ID的元素。
from bs4 import BeautifulSoup
html = "<html><head><title>Hello</title></head><body><h1 id='main'>Hello</h1><p>Hello</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')
tag = soup.select('#main')
print(tag)
  • 属性选择器:选择具有指定属性的元素。
from bs4 import BeautifulSoup
html = "<html><head><title>Hello</title></head><body><h1 class='header' id='main'>Hello</h1><p class='content'>Hello</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')
tags = soup.select('[class="header"]')
print(tags)

 --------------------

find_all(name, attrs, recursive, text, limit) 方法是BeautifulSoup中一个强大的功能,它可以根据不同的条件来查找HTML元素。这个方法接受多个可选参数,使你能够更加灵活地查找HTML元素。下面是一个全面的解释:
  1. name: 这个参数可以是一个字符串(表示要查找的标签名)或者一个列表(表示要查找的多个标签名)。如果提供了这个参数,find_all 方法将只返回名称匹配的元素。
  2. attrs: 这个参数可以是一个字典(表示属性名和属性值的映射)或者一个列表(表示多个属性名)。如果提供了这个参数,find_all 方法将只返回满足属性条件的元素。
  3. recursive: 如果设置为True,则在当前标签的子标签中查找元素。默认值为False。这个参数可以是一个布尔值。
  4. text: 这个参数可以是一个字符串(表示要查找的文本)或者一个列表(表示多个要查找的文本)。如果提供了这个参数,find_all 方法将只返回包含匹配文本的元素。
  5. limit: 这个参数用于限制查找结果数量。返回的生成器中的元素数量不会超过指定的数量。

例如,要查找所有的h1标签,所有具有class="header"属性的h1标签,以及所有包含文本"World"h1标签,可以使用以下代码:

from bs4 import BeautifulSoup
html = "<html><head><title>Hello</title></head><body><h1>Hello</h1><h1 class='header'>World</h1><h1>Hello</h1></body></html>"
soup = BeautifulSoup(html, 'html.parser')

# 查找所有的h1标签
h1_tags = soup.find_all('h1')
print(h1_tags)

# 查找所有具有class="header"属性的h1标签
header_h1_tags = soup.find_all('h1', attrs={'class': 'header'})
print(header_h1_tags)

# 查找所有包含文本"World"的h1标签
world_h1_tags = soup.find_all('h1', text='World')
print(world_h1_tags)
  •  处理HTML文档中的表格数据
from bs4 import BeautifulSoup
html = "<table><tr><td>1</td><td>Two</td></tr><tr><td>Three</td><td>4</td></tr></table>"
soup = BeautifulSoup(html, 'html.parser')

# 查找所有的表格单元格
table_cells = soup.find_all('td')
for cell in table_cells:
    print(cell.text)
  • 处理HTML链接:

要处理HTML中的链接,你可以使用find_all方法来查找所有的a标签。然后,你可以遍历查找到的链接列表,并提取链接的URL和文本内容。

from bs4 import BeautifulSoup
html = "<a href='https://www.example.com'>Example</a><a href='https://www.test.com'>Test</a>"
soup = BeautifulSoup(html, 'html.parser')

# 查找所有的链接
links = soup.find_all('a')
for link in links:
    print(link.get('href'), link.text)
  • 处理HTML图像:

要处理HTML中的图像,你可以使用find_all方法来查找所有的img标签。然后,你可以遍历查找到的图像列表,并提取图像的src属性值。

from bs4 import BeautifulSoup
html = "<img src='https://www.example.com/image1.jpg' alt='Image 1'><img src='https://www.example.com/image2.jpg' alt='Image 2'>"
soup = BeautifulSoup(html, 'html.parser')

# 查找所有的图像
images = soup.find_all('img')
for image in images:
    print(image.get('src'))
  •  正则表达式,find_all方法可以结合正则表达式来查找满足特定条件的HTML元素。在find_all方法中,你可以使用re模块的re.compile()函数来编译正则表达式,然后将编译后的正则表达式作为find_all方法的第一个参数。
import re
from bs4 import BeautifulSoup

html = "<a href='https://www.example.com'>Example</a><a href='https://www.test.com'>Test</a>"
soup = BeautifulSoup(html, 'html.parser')

# 使用正则表达式编译一个匹配所有URL的模式
url_pattern = re.compile(r'https://www\.[\w.-]+')

# 使用find_all方法查找所有满足正则表达式条件的a标签
links = soup.find_all('a', href=url_pattern)

for link in links:
    print(link.get('href'), link.text)
import re
from bs4 import BeautifulSoup

html = "<a href='https://www.example.com'>Example</a><a href='https://www.test.com'>Test</a>"
soup = BeautifulSoup(html, 'html.parser')

# 使用正则表达式编译一个匹配包含"Example"的文本的模式
example_pattern = re.compile(r'Example')

# 使用find_all方法查找所有包含"Example"的a标签
links_with_example = soup.find_all('a', text=example_pattern)

for link in links_with_example:
    print(link.get('href'), link.text)
import re
from bs4 import BeautifulSoup

html = "<div class='example'>Div 1</div><div class='test'>Div 2</div><div class='example example-2'>Div 3</div>"
soup = BeautifulSoup(html, 'html.parser')

# 使用正则表达式编译一个匹配包含"example"的class属性值的模式
example_pattern = re.compile(r'example')

# 使用find_all方法查找所有包含"example"的class属性值的div标签
divs_with_example = soup.find_all('div', class_=example_pattern)

for div in divs_with_example:
    print(div.get('class'), div.text)

--------------------- 

BeautifulSoup是一个用于解析HTML和XML文档的Python库,它提供了许多有用的方法来处理和操作文档中的元素。以下是BeautifulSoup的一些常用关键方法:

1. `find(name, attrs, recursive, text, limit)`: 查找文档中第一个满足条件的元素。
2. `find_all(name, attrs, recursive, text, limit)`: 查找文档中所有满足条件的元素。
3. `get_text(strip=True, separator=None)`: 提取文档中所有文本内容,并将它们连接成一个字符串。
4. `prettify(from_encode=None, to_encode=None, indent_increase=0, keep_whitespace=True, maximize_viewport_breadth=False)`: 将HTML或XML文档格式化成可读的字符串。
5. `select(selector)`: 使用CSS选择器查找文档中的元素。
6. `string`: 获取当前元素的文本内容。
7. `attrs`: 获取当前元素的属性字典。
8. `append(child)`: 向当前元素添加子元素。
9. `insert(index, child)`: 在指定位置插入子元素。
10. `delete()`: 从当前元素中删除所有子元素。
11. `unwrap()`: 移除当前元素的父元素。
12. `name`: 获取当前元素的标签名称。
13. `tag`: 获取当前元素的标签名称。
14. `parent`: 获取当前元素的父元素。
15. `children`: 获取当前元素的子元素列表。
16. `soup`: 获取包含当前元素的Soup对象。
17. `contents`: 获取当前元素的子元素列表,不包括文本节点。
18. `descendants`: 获取当前元素的所有后代元素列表。
19. `find_parent(name)`: 查找当前元素的父元素,如果父元素的标签名称匹配给定的名称,则返回父元素。
20. `find_parents(name)`: 查找当前元素的祖先元素,如果祖先元素的标签名称匹配给定的名称,则返回祖先元素。
21. `is_descendant(ancestor)`: 判断当前元素是否是给定祖先元素的后代。
22. `is_ancestor(descendant)`: 判断当前元素是否是给定后代元素的祖先。
23. `match`: 使用正则表达式匹配文档中的元素。

--------

HTML(HyperText Markup Language)是用于创建网页内容的标准标记语言。HTML元素和属性是构成HTML文档的基本组成部分。下面是一些常见的HTML元素和属性:

**元素**:

1. `<!DOCTYPE>`:定义文档类型和版本
2. `<html>`:页面的根元素
3. `<head>`:包含文档元数据、文档标题、链接到样式表等内容的元素
4. `<title>`:文档标题
5. `<body>`:包含文档内容的元素
6. `<h1>` 至 `<h6>`:文档标题的六个级别
7. `<p>`:段落
8. `<br>`:换行
9. `<hr>`:水平线
10. `<a>`:超链接
11. `<img>`:图像
12. `<ul>`:无序列表
13. `<ol>`:有序列表
14. `<li>`:列表项
15. `<table>`:表格
16. `<tr>`:表格行
17. `<th>`:表格标题单元格
18. `<td>`:表格单元格
19. `<div>`:用于组合HTML内容和样式的容器
20. `<span>`:内联容器,用于组合HTML内容和样式
21. `<form>`:表单
22. `<input>`:表单输入控件
23. `<textarea>`:多行文本输入控件
24. `<button>`:按钮
25. `<select>`:下拉列表
26. `<option>`:下拉列表项
27. `<iframe>`:内嵌框架
28. `<meta>`:文档元数据
29. `<link>`:链接到外部资源,如样式表
30. `<script>`:用于包含JavaScript代码的元素
31. `<style>`:用于包含CSS样式的元素
32. `<noscript>`:用于包含不支持脚本的浏览器时显示的内容
33. `<canvas>`:用于绘制动态图形的画布
34. `<audio>`:用于播放音频的元素
35. `<video>`:用于播放视频的元素
36. `<embed>`:用于嵌入外部应用程序或插件的元素

**属性**:

1. `class`:用于指定元素的CSS类
2. `id`:用于指定元素的唯一ID
3. `href`:用于指定`a`标签的链接地址
4. `src`:用于指定`img`、`audio`、`video`和`iframe`等元素的来源
5. `alt`:用于指定`img`元素的替代文本
6. `title`:用于指定元素的文档标题
7. `type`:用于指定`input`元素的类型,如文本、密码、checkbox等
8. `name`:用于指定`form`元素中的输入控件名称
9. `value`:用于指定`input`元素的初始值
10. `rows`:用于指定`textarea`元素的行数
11. `cols`:用于指定`textarea`元素的列数
12. `charset`:用于指定HTML文档的字符集
13. `charset`:用于指定`meta`元素的字符集
14. `hreflang`:用于指定`link`元素的语言代码
15. `crossorigin`:用于指定`img`、`audio`和`video`元素的跨域资源共享(CORS)设置
16. `controls`:用于指定`video`和`audio`元素是否显示播放控件
17. `loop`:用于指定`audio`和`video`元素是否自动播放并循环播放
18. `autoplay`:用于指定`audio`和`video`元素是否自动播放
19. `preload`:用于指定`audio`和`video`元素是否在加载页面时预加载
20. `muted`:用于指定`audio`和`video`元素是否静音
21. `poster`:用于指定`video`元素的前景图像
22. `width`:用于指定`img`、`iframe`和`video`元素的宽度
23. `height`:用于指定`img`、`iframe`和`video`元素的高度
24. `cellpadding`:用于指定`table`元素单元格的内边距
25. `cellspacing`:用于指定`table`元素单元格之间的间距
26. `cellborder`:用于指定`table`元素单元格边框是否可见
27. `align`:用于指定`table`、`img`和`hr`元素的对齐方式
28. `border`:用于指定`table`元素单元格边框的宽度
29. `cellmerg`:用于指定`table`元素单元格是否合并
30. `colspan`:用于指定`th`和`td`元素可以占用多个列
31. `rowspan`:用于指定`th`和`td`元素可以占用多个行
32. `scope`:用于指定`th`元素的作用域(row、col、rowgroup或colgroup)
33. `abbr`:用于指定`abbr`元素的缩写和完整形式
34. `cite`:用于指定`abbr`元素的完整形式的来源
35. `datetime`:用于指定`time`元素的日期和时间
36. `pubdate`:用于指定`time`元素的发布日期
37. `duration`:用于指定`time`元素的持续时间
38. `datatype`:用于指定`time`元素的数据类型
39. `decode`:用于指定`base`元素的编码
40. `href`:用于指定`base`元素的基础URL
41. `target`:用于指定`a`、`form`和`area`元素的目标窗口或框架
42. `media`:用于指定`link`元素的适用设备类型
43. `sizes`:用于指定`img`元素的可选尺寸列表
44. `usemap`:用于指定`img`元素的图像地图
45. `ismap`:用于指定`img`元素是否是图像地图
46. `role`:用于指定`a`、`area`、`button`、`img`和`summary`元素的角色
47. `tabindex`:用于指定表单元素的Tab键顺序
48. `contenteditable`:用于指定`div`和`span`元素是否可编辑

转载请注明出处或者链接地址:https://www.qianduange.cn//article/10578.html
评论
发布的文章

vue学习计划

2024-06-08 18:06:08

fastjson1.2.24-RCE漏洞复现

2024-06-08 09:06:33

JsonPath用法详解

2024-06-08 09:06:55

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!