Поиск и замена в HTML с BeautifulSoup - PullRequest
9 голосов
/ 15 января 2010

Я хочу использовать BeautfulSoup для поиска и замены <\a> на <\a><br>. Я знаю, как открыть с urllib2, а затем проанализировать, чтобы извлечь все теги <a>. Я хочу выполнить поиск и заменить закрывающий тег закрывающим тегом плюс разрыв. Любая помощь, высоко ценится.

EDIT

Я бы предположил, что это будет что-то похожее на:

soup.findAll('a').

В документации есть:

find(text="ahh").replaceWith('Hooray')

Так что я бы предположил, что это будет в духе:

soup.findAll(tag = '</a>').replaceWith(tag = '</a><br>')

Но это не работает, и помощь Python () не дает много

Ответы [ 3 ]

17 голосов
/ 15 января 2010

Это вставит тег <br> после конца каждого элемента <a>...</a>:

from BeautifulSoup import BeautifulSoup, Tag

# ....

soup = BeautifulSoup(data)
for a in soup.findAll('a'):
    a.parent.insert(a.parent.index(a)+1, Tag(soup, 'br'))

Вы не можете использовать soup.findAll(tag = '</a>'), потому что BeautifulSoup не работает с конечными тегами отдельно - они считаются частью одного и того же элемента.


Если вы хотите поместить элементы <a> в элемент <p>, как вы просите в комментарии, вы можете использовать это:

for a in soup.findAll('a'):
    p = Tag(soup, 'p') #create a P element
    a.replaceWith(p)   #Put it where the A element is
    p.insert(0, a)     #put the A element inside the P (between <p> and </p>)

Опять же, вы не создаете <p> и </p> по отдельности, потому что они являются частью одного и того же.

5 голосов
/ 07 июля 2015

предположим, что у вас есть элемент, который, как вы знаете, содержит теги разметки "br", один из способов удалить и заменить теги "br" другой строкой выглядит так:

originalSoup = BeautifulSoup("your_html_file.html")
replaceString = ", " # replace each <br/> tag with ", "
# Ex. <p>Hello<br/>World</p> to <p>Hello, World</p>
cleanSoup = BeautifulSoup(str(originalSoup).replace("<br/>", replaceString))
3 голосов
/ 15 января 2010

Вы не заменяете конечный тег; в BeautifulSoup вы имеете дело с объектной моделью документа, как в браузере, а не с строкой, полной HTML. Таким образом, вы не можете «заменить» конечный тег без замены начального тега.

Что вы хотите сделать, это вставить новый элемент <br> сразу после элемента <a>...</a>. Для этого вам нужно узнать индекс элемента <a> внутри его родительского элемента и вставить новый элемент сразу после этого индекса. например.

soup= BeautifulSoup('<body>blah <a href="foo">blah</a> blah</body>')
for link in soup.findAll('a'):
    br= Tag(soup, 'br')
    index= link.parent.contents.index(link)
    link.parent.insert(index+1, br)
# soup now serialises to '<body>blah <a href="foo">blah</a><br /> blah</body>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...