使用BeautifulSoup在HTML中搜索和替换

时间:2010-01-15 17:29:57

标签: python beautifulsoup

我想使用BeautfulSoup来搜索<\a>并将其替换为<\a><br>。我知道如何使用urllib2打开,然后解析以提取所有<a>标记。我想要做的是搜索并用结束标记和中断替换结束标记。任何帮助,非常感谢。

修改

我认为它会类似于:

soup.findAll('a').

在文档中,有一个:

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

所以我认为这将是:

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

但这不起作用,python help()不会提供太多

3 个答案:

答案 0 :(得分:17)

这将在每个<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>,因为它们是同一件事的一部分。

答案 1 :(得分:5)

假设你有一个你知道的元素包含“br”标记标记,一种删除&amp;标记的方法。用不同的字符串替换“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))

答案 2 :(得分:3)

您不替换结束标记;在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>'