- Beautiful Soup 教程
- Beautiful Soup - 首页
- Beautiful Soup - 概述
- Beautiful Soup - 网页抓取
- Beautiful Soup - 安装
- Beautiful Soup - 解析页面
- Beautiful Soup - 对象类型
- Beautiful Soup - 检查数据源
- Beautiful Soup - 抓取 HTML 内容
- Beautiful Soup - 通过标签导航
- Beautiful Soup - 通过 ID 查找元素
- Beautiful Soup - 通过类名查找元素
- Beautiful Soup - 通过属性查找元素
- Beautiful Soup - 搜索树结构
- Beautiful Soup - 修改树结构
- Beautiful Soup - 解析文档的一部分
- Beautiful Soup - 查找元素的所有子元素
- Beautiful Soup - 使用 CSS 选择器查找元素
- Beautiful Soup - 查找所有注释
- Beautiful Soup - 从 HTML 中抓取列表
- Beautiful Soup - 从 HTML 中抓取段落
- BeautifulSoup - 从 HTML 中抓取链接
- Beautiful Soup - 获取所有 HTML 标签
- Beautiful Soup - 获取标签内的文本
- Beautiful Soup - 查找所有标题
- Beautiful Soup - 提取标题标签
- Beautiful Soup - 提取邮箱 ID
- Beautiful Soup - 抓取嵌套标签
- Beautiful Soup - 解析表格
- Beautiful Soup - 选择第 n 个子元素
- Beautiful Soup - 通过标签内的文本搜索
- Beautiful Soup - 移除 HTML 标签
- Beautiful Soup - 移除所有样式
- Beautiful Soup - 移除所有脚本
- Beautiful Soup - 移除空标签
- Beautiful Soup - 移除子元素
- Beautiful Soup - find vs find_all
- Beautiful Soup - 指定解析器
- Beautiful Soup - 比较对象
- Beautiful Soup - 复制对象
- Beautiful Soup - 获取标签位置
- Beautiful Soup - 编码
- Beautiful Soup - 输出格式
- Beautiful Soup - 美化输出
- Beautiful Soup - NavigableString 类
- Beautiful Soup - 将对象转换为字符串
- Beautiful Soup - 将 HTML 转换为文本
- Beautiful Soup - 解析 XML
- Beautiful Soup - 错误处理
- Beautiful Soup - 故障排除
- Beautiful Soup - 移植旧代码
- Beautiful Soup - 函数参考
- Beautiful Soup - contents 属性
- Beautiful Soup - children 属性
- Beautiful Soup - string 属性
- Beautiful Soup - strings 属性
- Beautiful Soup - stripped_strings 属性
- Beautiful Soup - descendants 属性
- Beautiful Soup - parent 属性
- Beautiful Soup - parents 属性
- Beautiful Soup - next_sibling 属性
- Beautiful Soup - previous_sibling 属性
- Beautiful Soup - next_siblings 属性
- Beautiful Soup - previous_siblings 属性
- Beautiful Soup - next_element 属性
- Beautiful Soup - previous_element 属性
- Beautiful Soup - next_elements 属性
- Beautiful Soup - previous_elements 属性
- Beautiful Soup - find 方法
- Beautiful Soup - find_all 方法
- Beautiful Soup - find_parents 方法
- Beautiful Soup - find_parent 方法
- Beautiful Soup - find_next_siblings 方法
- Beautiful Soup - find_next_sibling 方法
- Beautiful Soup - find_previous_siblings 方法
- Beautiful Soup - find_previous_sibling 方法
- Beautiful Soup - find_all_next 方法
- Beautiful Soup - find_next 方法
- Beautiful Soup - find_all_previous 方法
- Beautiful Soup - find_previous 方法
- Beautiful Soup - select 方法
- Beautiful Soup - append 方法
- Beautiful Soup - extend 方法
- Beautiful Soup - NavigableString 方法
- Beautiful Soup - new_tag 方法
- Beautiful Soup - insert 方法
- Beautiful Soup - insert_before 方法
- Beautiful Soup - insert_after 方法
- Beautiful Soup - clear 方法
- Beautiful Soup - extract 方法
- Beautiful Soup - decompose 方法
- Beautiful Soup - replace_with 方法
- Beautiful Soup - wrap 方法
- Beautiful Soup - unwrap 方法
- Beautiful Soup - smooth 方法
- Beautiful Soup - prettify 方法
- Beautiful Soup - encode 方法
- Beautiful Soup - decode 方法
- Beautiful Soup - get_text 方法
- Beautiful Soup - diagnose 方法
- Beautiful Soup 有用资源
- Beautiful Soup - 快速指南
- Beautiful Soup - 有用资源
- Beautiful Soup - 讨论
Beautiful Soup - 修改树结构
Beautiful Soup 库的一个强大功能是能够操作解析后的 HTML 或 XML 文档并修改其内容。
Beautiful Soup 库具有不同的函数来执行以下操作:
向文档的现有标签添加内容或新标签
在现有标签或字符串之前或之后插入内容
清除现有标签的内容
修改标签元素的内容
添加内容
可以使用 Tag 对象上的 **append()** 方法向现有标签的内容添加内容。它的工作方式类似于 Python 列表对象的 append() 方法。
在下面的示例中,HTML 脚本有一个 <p> 标签。使用 append(),附加了额外的文本。
示例
from bs4 import BeautifulSoup
markup = '<p>Hello</p>'
soup = BeautifulSoup(markup, 'html.parser')
print (soup)
tag = soup.p
tag.append(" World")
print (soup)
输出
<p>Hello</p> <p>Hello World</p>
使用 append() 方法,可以在现有标签的末尾添加一个新标签。首先使用 **new_tag()** 方法创建一个新的 Tag 对象,然后将其传递给 append() 方法。
示例
from bs4 import BeautifulSoup, Tag
markup = '<b>Hello</b>'
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.b
tag1 = soup.new_tag('i')
tag1.string = 'World'
tag.append(tag1)
print (soup.prettify())
输出
<b>
Hello
<i>
World
</i>
</b>
如果需要向文档添加字符串,可以附加一个 **NavigableString** 对象。
示例
from bs4 import BeautifulSoup, NavigableString
markup = '<b>Hello</b>'
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.b
new_string = NavigableString(" World")
tag.append(new_string)
print (soup.prettify())
输出
<b> Hello World </b>
从 Beautiful Soup 4.7 版本开始,extend() 方法已添加到 Tag 类中。它将列表中的所有元素添加到标签中。
示例
from bs4 import BeautifulSoup markup = '<b>Hello</b>' soup = BeautifulSoup(markup, 'html.parser') tag = soup.b vals = ['World.', 'Welcome to ', 'TutorialsPoint'] tag.extend(vals) print (soup.prettify())
输出
<b> Hello World. Welcome to TutorialsPoint </b>
插入内容
可以使用 **insert()** 方法在 Tag 元素的子元素列表中指定位置添加元素,而不是在末尾添加新元素。Beautiful Soup 中的 insert() 方法的行为类似于 Python 列表对象上的 insert()。
在下面的示例中,一个新的字符串被添加到 <b> 标签的第 1 个位置。生成的解析文档显示了结果。
示例
from bs4 import BeautifulSoup, NavigableString markup = '<b>Excellent </b><u>from TutorialsPoint</u>' soup = BeautifulSoup(markup, 'html.parser') tag = soup.b tag.insert(1, "Tutorial ") print (soup.prettify())
输出
<b> Excellent Tutorial </b> <u> from TutorialsPoint </u>
Beautiful Soup 还具有 **insert_before()** 和 **insert_after()** 方法。它们各自的目的是在给定的 Tag 对象之前或之后插入标签或字符串。以下代码显示了在 <b> 标签之后添加字符串“Python 教程”。
示例
from bs4 import BeautifulSoup, NavigableString
markup = '<b>Excellent </b><u>from TutorialsPoint</u>'
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.b
tag.insert_after("Python Tutorial")
print (soup.prettify())
输出
<b> Excellent </b> Python Tutorial <u> from TutorialsPoint </u>
另一方面,insert_before() 方法在下面使用,在 <b> 标签之前添加“这是一个”文本。
tag.insert_before("Here is an ")
print (soup.prettify())
输出
Here is an <b> Excellent </b> Python Tutorial <u> from TutorialsPoint </u>
清除内容
Beautiful Soup 提供了多种方法从文档树中移除元素的内容。每种方法都有其独特的特性。
**clear()** 方法是最直接的方法。它简单地移除指定 Tag 元素的内容。以下示例显示了其用法。
示例
from bs4 import BeautifulSoup, NavigableString
markup = '<b>Excellent </b><u>from TutorialsPoint</u>'
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.find('u')
tag.clear()
print (soup.prettify())
输出
<b> Excellent </b> <u> </u>
可以看出,clear() 方法移除了内容,但保留了标签。
对于下面的示例,我们解析以下 HTML 文档,并在所有标签上调用 clear() 方法。
<html>
<body>
<p> The quick, brown fox jumps over a lazy dog.</p>
<p> DJs flock by when MTV ax quiz prog.</p>
<p> Junk MTV quiz graced by fox whelps.</p>
<p> Bawds jog, flick quartz, vex nymphs./p>
</body>
</html>
这是使用 clear() 方法的 Python 代码
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
tags = soup.find_all()
for tag in tags:
tag.clear()
print (soup.prettify())
输出
<html> </html>
**extract()** 方法从文档树中移除标签或字符串,并返回被移除的对象。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
tags = soup.find_all()
for tag in tags:
obj = tag.extract()
print ("Extracted:",obj)
print (soup)
输出
Extracted: <html> <body> <p> The quick, brown fox jumps over a lazy dog.</p> <p> DJs flock by when MTV ax quiz prog.</p> <p> Junk MTV quiz graced by fox whelps.</p> <p> Bawds jog, flick quartz, vex nymphs.</p> </body> </html> Extracted: <body> <p> The quick, brown fox jumps over a lazy dog.</p> <p> DJs flock by when MTV ax quiz prog.</p> <p> Junk MTV quiz graced by fox whelps.</p> <p> Bawds jog, flick quartz, vex nymphs.</p> </body> Extracted: <p> The quick, brown fox jumps over a lazy dog.</p> Extracted: <p> DJs flock by when MTV ax quiz prog.</p> Extracted: <p> Junk MTV quiz graced by fox whelps.</p> Extracted: <p> Bawds jog, flick quartz, vex nymphs.</p>
可以提取标签或字符串。以下示例显示了 antag 被提取。
示例
html = '''
<ol id="HR">
<li>Rani</li>
<li>Ankita</li>
</ol>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
obj=soup.find('ol')
obj.find_next().extract()
print (soup)
输出
<ol id="HR"> <li>Ankita</li> </ol>
更改 extract() 语句以移除第一个 <li> 元素的内部文本。
示例
obj.find_next().string.extract()
输出
<ol id="HR"> <li>Ankita</li> </ol>
还有另一个方法 decompose(),它从树中移除标签,然后完全销毁它及其内容:
示例
html = '''
<ol id="HR">
<li>Rani</li>
<li>Ankita</li>
</ol>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
tag1=soup.find('ol')
tag2 = soup.find('li')
tag2.decompose()
print (soup)
print (tag2.decomposed)
输出
<ol id="HR"> <li>Ankita</li> </ol>
decomposed 属性返回 True 或 False - 元素是否已被分解。
修改内容
我们将看看 **replace_with()** 方法,它允许替换标签的内容。
就像 Python 字符串一样,它是不可变的,NavigableString 也不能就地修改。但是,可以使用 replace_with() 将标签的内部字符串替换为另一个字符串。
示例
from bs4 import BeautifulSoup
soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>",'html.parser')
tag = soup.h2
tag.string.replace_with("OnLine Tutorials Library")
print (tag.string)
输出
OnLine Tutorials Library
这是一个显示 replace_with() 用法的另一个示例。如果将 BeautifulSoup 对象作为参数传递给某些函数(例如 replace_with()),则可以组合两个解析的文档。2524
示例
from bs4 import BeautifulSoup
obj1 = BeautifulSoup("<book><title>Python</title></book>", features="xml")
obj2 = BeautifulSoup("<b>Beautiful Soup parser</b>", "lxml")
obj2.find('b').replace_with(obj1)
print (obj2)
输出
<html><body><book><title>Python</title></book></body></html>
**wrap()** 方法将元素包装在您指定的标签中。它返回新的包装器。
from bs4 import BeautifulSoup
soup = BeautifulSoup("<p>Hello Python</p>", 'html.parser')
tag = soup.p
newtag = soup.new_tag('b')
tag.string.wrap(newtag)
print (soup)
输出
<p><b>Hello Python</b></p>
另一方面,**unwrap()** 方法用标签内的内容替换标签。它适用于去除标记。
示例
from bs4 import BeautifulSoup
soup = BeautifulSoup("<p>Hello <b>Python</b></p>", 'html.parser')
tag = soup.p
tag.b.unwrap()
print (soup)
输出
<p>Hello Python</p>