2016-09-15 4 views
0

私はこのような構造を持つ文書があります。他の2つのタグの間に1つのタグを見つける方法はありますか?

<tag1>some_text_1</tag1> 
<tag2>text_1</tag2> 
<tag3>....</tag3> 
<tag2>text_2</tag2> 
<tag1>some_text_2</tag1> 
<tag2>text_3</tag2> 
... 

を私はsome_text_1tag1後、次のtag1の前にあるすべてのtag2のインスタンスを取得する必要があります。

+0

次の前にtag2のすべてのインスタンスが意味をなさないため、< tag2>テキスト2の前か、 some_text_2の意味ですか?タグ2が1つしかないためです。 – Sandeep

+0

タグ2はどこからでも、直後からでもどこからでもアクセスできますか?あなたの入力例は、あなたの問題の説明に役立たない。 –

+0

はい、私は悪いのは、指定されたテキストと、次のタグ1の前にtag1の後にする必要があります – GhostKU

答えて

0
from bs4 import BeautifulSoup 

html = '''<tag1>some_text_1</tag1> 
     <tag2>text_1</tag2> 
    <tag3>....</tag3> 
    <tag2>text_2</tag2> 
    <tag1>some_text_2</tag1> 
    <tag2>text_3</tag2>''' 

soup = BeautifulSoup(html,"html.parser") 

def findalltags(tag1,tag2,soup): 
    # tag1 is between which tag 
    # tag2 get info of which tag 
    a = soup.find(tag1) 
    lis = [] 
    while True: 
     a = a.find_next() 
     if(str(a.name) == tag1): 
      break 
     elif(str(a.name) == tag2): 
      lis.append(a) 
    return lis 
if __name__ == '__main__': 
    print findalltags('tag1','tag2',soup) 

これで問題は解決しますが、これは効率的な方法ではないと思います。正規表現をよく知っていれば正規表現を使用できます。

+0

'a.name'は文字列ですが、括弧も必要ありません。 –

+0

私たちはUnicodeでそれを取得しますそれは文字列と等しいので、それを避けるために私は文字列に変換するとわからない – Sandeep

+1

'u" foo "==" foo "'はうまく動作します名前のascii文字がstrを呼び出すとエラーになります。 –

1

説明tag1の後にあるすべてのtag2インスタンスをsome_text_1で取得し、次のタグ2より前に取得する必要があります。は、基本的には、some_text_というテキストのタグ1の後に最初のtag2を取得することと同じです。

のでtag1'sは、特定のテキストを検索し、それがTAG2を引っ張っている場合は次の兄弟タグは、tag2であるかどうかを確認:

html = """<tag1>some_text_1</tag1> 
<tag2>text_1</tag2> 
<tag3>....</tag3> 
<tag2>text_2</tag2> 
<tag1>some_text_2</tag1> 
<tag2>text_3</tag2>""" 


def get_tags_if_preceded_by(soup, tag1, tag2, text): 
    for t1 in soup.find_all(tag1, text=text): 
     nxt_sib = t1.find_next_sibling() 
     if nxt_sib and nxt_sib.name == tag2: 
      yield nxt_sib 

soup = BeautifulSoup(html, "lxml") 

print(list(get_tags_if_preceded_by(soup, "tag1", "tag2", "some_text_1"))) 

それが直接の後である必要はありません場合は、それが実際に可能それは単純に、あなただけの特定のtag2兄弟を検索する必要があります。

def get_tags_if_preceded_by(soup, tag1, tag2, text): 
    for t1 in soup.find_all(tag1, text=text): 
     nxt_sib = t1.find_next_sibling(t2) 
     if nxt_sib: 
      yield nxt_sib 

あなたは本当に、特に二つのタグの間のタグを検索したい場合は、あなたがthis answerのロジックを使用することができます。

関連する問題