2015-04-17 3 views
0

Я пытаюсь найти тег в документе XML и полностью заменить его новым тегом. Я получил то, что я думаю, что должен работать ниже:Замените тег другим тегом в BeautifulSoup

para = monograph.find('para', text='Some text.') 
newpara = '<para>Some <emph type="bold">new</emph> text.</para>' 
newpara = BeautifulSoup(newpara, 'xml') 
para.replaceWith(newpara) 

К сожалению, когда я запускаю это, я получаю:

Traceback (most recent call last): 
File "<input>", line 1, in <module> 
File "C:\Python34\lib\site-packages\bs4\element.py", line 211, in replace_with 
my_index = self.parent.index(self) 
AttributeError: 'NoneType' object has no attribute 'index' 

Любые советы?

+0

Что делает 'monograph.find ('para', text = 'Some text.')' Return? –

+0

Значение пара: Некоторые тексты.. –

ответ

0

Вы можете использовать replaceWith() для достижения этой цели, вот один из способов, как это сделать:

In [8]: from bs4 import BeautifulSoup 

In [9]: tree = BeautifulSoup('<html><body><div>Foo</div><div>Bar</div><para>Some text.</para></body></html>', 'xml') 

In [10]: newpara = '<para>Some <emph type="bold">new</emph> text.</para>' 

In [11]: newpara = BeautifulSoup(newpara, 'xml') 

# here I use newpara.para as a shortcut to get the <para> element 
# as a new BeautifulSoup will include wrapping tags 
In [12]: tree.find('para', text='Some text.').replaceWith(newpara.para) 
Out[12]: <para>Some text.</para> 

In [13]: print tree 
<?xml version="1.0" encoding="utf-8"?> 
<html><body><div>Foo</div><div>Bar</div><para>Some <emph type="bold">new</emph> text.</para></body></html> 

Надеется, что это помогает.

+0

Спасибо, по какой-то причине, комбинацию поиска и замены, как и вы, сделали трюк. Я уже понял, что мне нужно указать newpara.para, но он все еще не работает. В любом случае, он работает сейчас! –

Смежные вопросы