在 BeautifulSoup 中替换文本而不转义
Replace text without escaping in BeautifulSoup
我想用 BeautifulSoup 中的锚点 links 包装一些还没有 links 的词。我用这个来实现它:
from bs4 import BeautifulSoup
import re
text = ''' replace this string '''
soup = BeautifulSoup(text)
pattern = 'replace'
for txt in soup.findAll(text=True):
if re.search(pattern,txt,re.I) and txt.parent.name != 'a':
newtext = re.sub(r'(%s)' % pattern,
r'<a href="#"></a>',
txt)
txt.replaceWith(newtext)
print(soup)
不幸的是 returns
<html><body><p><a href="#replace">replace</a> this string </p></body></html>
而我正在寻找:
<html><body><p><a href="#replace">replace</a> this string </p></body></html>
有什么方法可以告诉 BeautifulSoup 不要转义 link 元素?
此处无法用简单的正则表达式替换,因为我最终不仅要替换一个模式,而且要替换多个模式。这就是为什么我决定使用 BeautifulSoup 来排除所有已经是 link.
的原因
您需要使用 new_tag
use insert_after
创建新标签,以便在新创建的 a
标签后插入您的 text
的一部分。
for txt in soup.find_all(text=True):
if re.search(pattern, txt, re.I) and txt.parent.name != 'a':
newtag = soup.new_tag('a')
newtag.attrs['href'] = "#{}".format(pattern)
newtag.string = pattern
txt.replace_with(newtag)
newtag.insert_after(txt.replace(pattern, ""))
我想用 BeautifulSoup 中的锚点 links 包装一些还没有 links 的词。我用这个来实现它:
from bs4 import BeautifulSoup
import re
text = ''' replace this string '''
soup = BeautifulSoup(text)
pattern = 'replace'
for txt in soup.findAll(text=True):
if re.search(pattern,txt,re.I) and txt.parent.name != 'a':
newtext = re.sub(r'(%s)' % pattern,
r'<a href="#"></a>',
txt)
txt.replaceWith(newtext)
print(soup)
不幸的是 returns
<html><body><p><a href="#replace">replace</a> this string </p></body></html>
而我正在寻找:
<html><body><p><a href="#replace">replace</a> this string </p></body></html>
有什么方法可以告诉 BeautifulSoup 不要转义 link 元素?
此处无法用简单的正则表达式替换,因为我最终不仅要替换一个模式,而且要替换多个模式。这就是为什么我决定使用 BeautifulSoup 来排除所有已经是 link.
的原因您需要使用 new_tag
use insert_after
创建新标签,以便在新创建的 a
标签后插入您的 text
的一部分。
for txt in soup.find_all(text=True):
if re.search(pattern, txt, re.I) and txt.parent.name != 'a':
newtag = soup.new_tag('a')
newtag.attrs['href'] = "#{}".format(pattern)
newtag.string = pattern
txt.replace_with(newtag)
newtag.insert_after(txt.replace(pattern, ""))