在BeautifulSoup中替换文本而不转义

时间:2015-06-07 10:09:28

标签: python html escaping beautifulsoup

我想在BeautifulSoup中包含一些尚未与锚链接链接的单词。我用它来实现它:

   public synchronized void method1A() {
       // ......
    method1B();
   }

   public synchronized void method1B() {
       // ...
   }

遗憾的是返回

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="#\1">\1</a>',
                         txt)
        txt.replaceWith(newtext)
print(soup)

我正在寻找:

<html><body><p>&lt;a href="#replace"&gt;replace&lt;/a&gt; this string </p></body></html>

有没有办法告诉BeautifulSoup不要逃避链接元素?

要替换的简单正则表达式不会在这里做,因为我最终不仅会有一个我想要替换但只有多个的模式。这就是我决定使用BeautifulSoup排除已经是链接的所有内容的原因。

1 个答案:

答案 0 :(得分:2)

您需要使用new_tag使用insert_after创建新代码,以便在新创建的text代码后插入部分a

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, ""))