2010-04-28 19 views
1

J'ai un document XML partiellement converti en soupe provenant de HTML. Après un certain remplacement et l'édition dans la soupe, le corps est essentiellement -En Python BeautifulSoup Comment déplacer les balises

<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. 

J'ai besoin de « déplacer » les balises <p> être des enfants à <Text> ou savoir comment supprimer le </Text>. Je veux -

<Text...> 
<p class=norm ...</p> 
<p class=norm ...</p> 
</Text> 
<Text...> 
<p class=norm ...</p> 
</Text> 

J'ai essayé d'utiliser item.insert et item.append mais je pense qu'il doit y avoir une solution plus élégante.

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) 

Merci

+0

Juste pour que vous connaissez JJ, Les balises html/xml ne s'affichent pas dans votre question à moins que vous ne les échappiez avec '' s si c'est un petit morceau dans une phrase ou que vous en fassiez des blocs de code si nécessaire. Je l'ai réparé cette fois, mais je pensais que vous devriez savoir pour l'avenir. –

+0

Merci. Je me demandais comment cela fonctionnait. J'apprécie votre supervision et votre aide. – user3591360

Répondre

2

Vous pouvez utiliser insert pour déplacer les tags. Les docs disent: "Un élément ne peut apparaître que dans un seul arbre d'analyse Si vous insérez un élément qui est déjà connecté à un objet soupe, il est déconnecté (avec l'extrait) avant d'être connecté ailleurs."

Si votre HTML ressemble à ceci:

<text></text> 
<p class="norm">1</p> 
<p class="norm">2</p> 
<text></text> 
<p class="norm">3</p> 

... ceci:

for item in soup.findAll(['text', 'p']): 
    if item.name == 'text': 
    text = item 
    if item.name == 'p': 
    text.insert(len(text.contents), item) 

... produirait ce qui suit:

<text><p class="norm">1</p><p class="norm">2</p></text> 
<text><p class="norm">3</p></text> 
+0

Cool. C'est utile. Je vais faire un tourbillon et voir comment cela fonctionne. Je n'ai pas dû lire assez profondément entre les lignes. – user3591360