Need Help with the BeautifulSoup problem, please

Peter Otten __peter__ at web.de
Mon Dec 16 04:33:24 EST 2013


seaspeak at gmail.com wrote:

>     I need to replace all tag <b> with <span> after ■. But the result from
>     below is '■   <span style="REPLACE">D</span> / <font></font>'
> Can you explain what I did wrong, please.
> 
>     s = '■<b>A</b> <b>B</b> <b>C</b> <b>D</b> / <font></font>'
>     soup = BeautifulSoup(s)
>     for i in soup.find_all(text='■'):
>         tag = soup.new_tag('span')
>         tag['style'] = 'REPLACE'
>         for ii in i.find_next_siblings():
>             if ii.name=='font' or str(ii).lstrip('')[0:1]=='/':
>                 break
>             else:
>                 if ii.name=='b':
>                     tag.string=ii.string
>                     print(ii.replace_with(tag))
>     print(soup)

It looks like you cannot reuse a tag. Try

    s = '■<b>A</b> <b>B</b> <b>C</b> <b>D</b> / <font></font>'
    soup = BeautifulSoup(s)
    for i in soup.find_all(text='■'):
        for ii in i.find_next_siblings():
            if ii.name=='font' or str(ii).lstrip('')[0:1]=='/':
                break
            else:
                if ii.name=='b':
                    tag = soup.new_tag('span')
                    tag['style'] = 'REPLACE'
                    tag.string=ii.string
                    print(ii.replace_with(tag))
    print(soup)





More information about the Python-list mailing list