遍历 html 中的所有元素并将内容替换为 Beautifulsoup

Iterate over all elements in html and replace content with Beautifulsoup

在我的数据库中,我存储 HTML 来自自定义 CMS 的所见即所得编辑器。 内容是英文的,我想使用 Beautifulsoup 遍历每个元素,将其内容翻译成德语(使用另一个 class,翻译器)并将当前元素的值替换为翻译文本。

到目前为止,我已经能够结合 Beautifulsoup 的 .findAll 函数为 p、a、pre 提出特定的 select 或我不清楚如何简单地遍历所有元素并即时替换它们的内容,而不是必须根据特定类型进行过滤。

编辑器生成的一个非常基本的 HTML 示例,涵盖所有不同类型:

<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<p>Normal text</p>
<p><strong>Bold text</strong></p>
<p><em>Italic text </em></p>
<p><br></p>
<blockquote>Quote</blockquote>
<p>text after quote</p>
<p><br></p>
<p><br></p>
<pre class="code-syntax" spellcheck="false">code</pre>
<p><br></p>
<p>text after code</p>
<p><br></p>
<p><a href="https://google.com/" target="_blank">This is a search engine</a></p>
<p><br></p>
<p><img src="https://via.placeholder.com/350x150"></p>

bs4 文档向我指出了一个 replace_with 函数,如果我只能 select 每个元素一个接一个,而不必专门 select 某些东西,这将是理想的。

欢迎指点

您基本上可以这样做来遍历每个元素:

html="""
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<p>Normal text</p>
<p><strong>Bold text</strong></p>
<p><em>Italic text </em></p>
<p><br></p>
<blockquote>Quote</blockquote>
<p>text after quote</p>
<p><br></p>
<p><br></p>
<pre class="code-syntax" spellcheck="false">code</pre>
<p><br></p>
<p>text after code</p>
<p><br></p>
<p><a href="https://google.com/" target="_blank">This is a search engine</a></p>
<p><br></p>
<p><img src="https://via.placeholder.com/350x150"></p>
"""

from bs4 import BeautifulSoup

soup=BeautifulSoup(html,"lxml")
for x in soup.findAll():
    print(x.text)
    # You can try this as well
    print(x.find(text=True,recursive=False))
    # I think this will return result as you expect.

输出:

Heading 1
Heading 2
Heading 3
Normal text
Bold text
Italic text 

Quote
text after quote


code

text after code

This is a search engine



Heading 1
Heading 2
Heading 3
Normal text
Bold text
Italic text 

Quote
text after quote


code

text after code

This is a search engine



Heading 1
Heading 2
Heading 3
Normal text
Bold text
Bold text
Italic text 
Italic text 


Quote
text after quote




code


text after code


This is a search engine
This is a search engine



而且我相信你有翻译功能,你也知道如何替换它。

这里有一个关于如何使用 BeautifulSoup 替换字符串的小示例代码。在您的情况下,您需要一个初步步骤,获取语言之间的映射,字典可能就是这种情况。

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml') # or use any other parser

new_string = 'xxx' # replace each string with the same value
_ = [s.replace_with(new_string) for s in soup.find_all(string=True)]

print(soup.prettify())