2016-05-23 4 views
0

美しいスープを使用してテキストを抽出しようとしています。関連部分はこのように見えます。ノードのインスタンスに基づく抽出

... 
<p class="consistent"><strong>RecurringText</strong></p> 
<p class="consistent">Text1</p> 
<p class="consistent">Text2</p> 
<p class="consistent">Text3</p> 
<p class="consistent"><strong>VariableText</strong></p> 
... 

名前が示すように、RecurringTextはすべてのファイルで一貫しています。ただし、VariableTextは変更されます。それが共通しているのは、次のコーディングされたセクションだけです。 Text1、Text2、Text3を抽出したいと思います。前に来るもの(RecurringTextを含む)と後ろのもの(VariableTextを含む)は後に残すことができます。 RecurringTextから抽出した部分は他の場所にありますが、それが意味をなさえすれば、次の項目を削除する方法がわかりません。

合計で、Text1、Text2、...、Textnの最後の項目の後に一貫して来るVariableText(文字列はURL全体で可変です)の特性に基づいてどのように抽出できますか(nはファイル間で異なります)。

答えて

1

あなたは基本的にstrong要素を含む別のp要素にstrong要素を含むp要素からアイテムを取得することができます:

from bs4 import BeautifulSoup 

data = """ 
<div> 
    <p class="consistent"><strong>RecurringText</strong></p> 
    <p class="consistent">Text1</p> 
    <p class="consistent">Text2</p> 
    <p class="consistent">Text3</p> 
    <p class="consistent"><strong>VariableText</strong></p> 
</div> 
""" 

soup = BeautifulSoup(data, "html.parser") 
for p in soup.find_all(lambda elm: elm and elm.name == "p" and elm.text == "RecurringText" and \ 
         "consistent" in elm.get("class") and elm.strong): 
    for item in p.find_next_siblings("p"): 
     if item.strong: 
      break 
     print(item.text) 

プリント:

Text1 
Text2 
Text3 
+0

感謝を!私の理解から、これは強いクラスの "一貫性のある" pクラスを持つ要素を探し、次にその基準に一致する次の要素に移動します。問題は、このように見える複数のリストがあることですが、私が一意に関係するリストは、RecurringTextを最初に持っています。コードを修正するには、最初の検索後(そのすべての一般的な条件を取得する)、「RecurringText」を見つけて次の兄弟に行くのが最善でしょうか? –

+0

もう一度ありがとう!これはPython/Beautiful Soupでの私の最初の経験です。もっと詳しく知りたい場合は、「lambda関数を使ってすべてを見つける」をお探しですか? –

+0

1つのエラーが発生しました。実際には '

'です。スペースが問題を引き起こすようです。私はこれを見て、elm.get( "class") 'の' 'class1.class2 ''を使って試しましたが、それは正しい解決策ではないようです。 –

関連する問題