您可以使用解析器以递归方式导航您的树并仅替换由文本组成的标签。
这样做时,您仍然需要考虑几件事:
- 并非所有文本都需要替换(例如内联 javascript)
- 文档的某些元素可能不需要解析(例如标题等)
这是一个快速且非生产就绪的示例,说明如何实现这一目标:
html = """The HTML you need to parse"""
import BeautifulSoup
IGNORE_TAGS = ['script', 'style']
def parse_content(item, replace_what, replace_with, ignore_tags = IGNORE_TAGS):
for content in item.contents:
if isinstance(content, BeautifulSoup.NavigableString):
content.replaceWith(content.replace(replace_what, replace_with, ignore_tags))
else:
if content.name not in ignore_tags:
parse_content(content, replace_what, replace_with, ignore_tags)
return item
soup = BeautifulSoup.BeautifulSoup(html)
body = soup.html.body
replaced_content = parse_content(body, 'a', 'b')
这应该用“b”替换任何出现的“a”,但留下的内容是:
- 内联 javascript 或 css(尽管内联 JS 或 CSS 不应出现在文档的正文中)。
- 标签中的引用,例如 img, a...
- 标签本身
当然,根据你的词汇表,你需要确保你不会只用其他东西替换单词的一部分;为此,使用 regex insted of content.replace 是有意义的。