У меня есть частично преобразованный XML-документ в супе, прибывающем из HTML. После некоторой замены и редактирующий в супе, тело по существу -
<Text...></Text> # This replaces <a href..> tags but automatically creates the </Text>
<p class=norm ...</p>
<p class=norm ...</p>
<Text...></Text>
<p class=norm ...</p> and so forth.
Я должен "переместиться" <p>
теги, чтобы быть детьми к <Text>
или знайте, как подавить </Text>
. Я хочу -
<Text...>
<p class=norm ...</p>
<p class=norm ...</p>
</Text>
<Text...>
<p class=norm ...</p>
</Text>
Я попытался использовать item.insert и item.append, но я думаю, что должно быть более изящное решение.
for item in soup.findAll(['p','span']):
if item.name == 'span' and item.has_key('class') and item['class'] == 'section':
xBCV = short_2_long(item._getAttrMap().get('value',''))
if currentnode:
pass
currentnode = Tag(soup,'Text', attrs=[('TypeOf', 'Section'),... ])
item.replaceWith(currentnode) # works but creates end tag
elif item.name == 'p' and item.has_key('class') and item['class'] == 'norm':
childcdatanode = None
for ahref in item.findAll('a'):
if childcdatanode:
pass
newlink = filter_hrefs(str(ahref))
childcdatanode = Tag(soup, newlink)
ahref.replaceWith(childcdatanode)
Спасибо
Вы можете использовать insert для перемещения тегов. В документации сказано: "Элемент может встречаться только в одном месте в одном дереве разбора. Если вы дадите insert элементу, который уже соединен с объектом супа, он будет отсоединен (с помощью extract), прежде чем будет соединен в другом месте."
Если ваш HTML выглядит так:
<text></text>
<p class="norm">1</p>
<p class="norm">2</p>
<text></text>
<p class="norm">3</p>
... то this:
for item in soup.findAll(['text', 'p']):
if item.name == 'text':
text = item
if item.name == 'p':
text.insert(len(text.contents), item)
... даст следующее:
<text><p class="norm">1</p><p class="norm">2</p></text>
<text><p class="norm">3</p></text>