2017-07-10 20 views
0

私はbeautifulsoupを使って次のようにしたいと思います。
次のようなhtmlファイルがあります。美しいスープで隣のタグを囲む方法

<img src="00001.jp"> 
<figcaption>caption string1</figcaption> 

<img src="00002.jp"> 

<img src="00003.jp"> 
<figcaption>caption string3</figcaption> 

このhtmlを次のように変換します。

<figure> 
    <img src="00001.jp"> 
    <figcaption>caption string1</figcaption> 
</figure> 

<figure> 
    <img src="00002.jp"> 
</figure> 

<figure> 
    <img src="00003.jp"> 
    <figcaption>caption string3</figcaption> 
</figure> 

imgタグの次にfigcaptionタグがある場合は、Figureタグで囲んでください。 それが違う場合、imgタグだけをfigureタグで囲みたいと思います。
imgタグのみを図形タグで囲み、次のコードで囲むことは可能です。

from bs4 import BeautifulSoup 

html = "<img src="00001.jp"> 
<figcaption>caption string1</figcaption> 

<img src="00002.jp"> 

<img src="00003.jp"> 
<figcaption>caption string3</figcaption>" 

content = BeautifulSoup(html) 

for img_tag in content.find_all('img'): 
    img_tag.wrap(content.new_tag('figure')) 

ただし、次のタグがfigcaptionタグであることを検出する方法はわかりません。
また、imgタグとfigcaptionをfigureタグで囲むかどうかはわかりません。

答えて

2

あり、単一の行でそれを行うには方法はませんが、あなたは小さな変更のカップルとそれを行うことができます。

for img_tag in content.find_all('img'):   
    fig = content.new_tag('figure') 
    img_tag.wrap(fig) 

    next_node = img_tag.find_next() 
    if next_node and next_node.name == 'figcaption':   
     fig.append(next_node) 

print(content) 

あなたが最初figureタグを作成し、それへの参照を維持する必要があるだろうである場合、タグをimageタグで囲みます。その後、img_tag.find_next()を使用して次の兄弟を取得し、それがfigcaptionタグであるかどうかを確認します。はいの場合は、そのタグをfigureタグの子として追加します。

すべての変更が適切に行われていることを理解するのに役立ちます。

このコードが得られます:

<figure> 
    <img src="00001.jp"/> 
    <figcaption>caption string1</figcaption> 
</figure> 
<figure><img src="00002.jp"/></figure> 
<figure> 
    <img src="00003.jp"/> 
    <figcaption>caption string3</figcaption> 
</figure> 
+1

@COLDSPEEDのおかげでそれはとてもよく働きました!! :) – xKxAxKx

+0

うれしい私は助けることができます:) –

関連する問題