Python Find & Replace Beautiful Soup

Я использую Beautiful Soup для замены вхождений шаблона ссылкой href внутри HTML-файла.

Я столкнулся с проблемой, как описано ниже

modified_contents = re.sub("([^http://*/s]APP[a-z]{2}[0-9]{2})", "<a href=\"http://stack.com=\\1\">\\1</a>", str(soup))

Пример ввода 1:

Input File contains APPdd34

Output File contains <a href="http://stack.com=APPdd34"> APPdd34</a>

Пример ввода 2:

Input File contains <a href="http://stack.com=APPdd34"> APPdd34</a>

Output File contains <a href="http://stack.com=<a href="http://stack.com=APPdd34"> APPdd34</a>"> <a href="http://stack.com=APPdd34"> APPdd34</a></a>

Желаемый выходной файл 2 такой же, как и образец входного файла 2.

Как я могу исправить эту проблему?


person c_prog_90    schedule 13.07.2011    source источник
comment
Вам нужно не [^...], а отрицательное утверждение просмотра назад (и в конце отрицательное утверждение просмотра назад). Прочтите об этом в руководстве по Python.   -  person Chris Morgan    schedule 13.07.2011
comment
Вам может пригодиться pythex, который позволяет тестировать регулярные выражения Python в режиме реального времени.   -  person Pat B    schedule 13.07.2011


Ответы (1)


Это может не полностью решить вашу проблему, потому что я не знаю, как может выглядеть весь входной файл, но я надеюсь, что это направление, которое вы можете выбрать.

from BeautifulSoup import BeautifulSoup, Tag
text = """APPdd34"""
soup = BeautifulSoup(text)
var1 = soup.text
text = """&lt;a href="http://stack.com=APPdd34"&gt; APPdd34&lt;/a&gt;"""
soup = BeautifulSoup(text)
var2 = soup.find('a').text

soup = BeautifulSoup("&lt;p>Some new html&lt;/p&gt;")
tag1 = Tag(soup, "a",{'href':'http://stack.com='+var1,})
tag1.insert(0,var1) # Insert text
tag2 = Tag(soup, "a",{'href':'http://stack.com='+var2,})
tag2.insert(0,var2)
soup.insert(0,tag1)
soup.insert(3,tag2)
print soup.prettify()

Так что в основном просто используйте BeautifulSoup для извлечения текста, а затем вы можете создавать теги оттуда.

person Doran    schedule 03.10.2011