如何在两个其他标签之间找到一个标签?

问题描述:

我有这样与结构的文档:如何在两个其他标签之间找到一个标签?

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

,我需要得到所有tag2实例是tag1some_text_1后先下一tag1

+0

您的意思是在下一个 text_2之前或之前 some_text_2因为tag2在下一个tag2之前的所有实例都没有意义。因为只会有一个tag2。 – Sandeep

+0

tag2可以在任何地方之后或之后?您的示例输入不适合您的问题描述。 –

+0

是的,我的不好,应该是在指定文本的tag1之后,在下一个tag1之前 – GhostKU

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'是一个字符串,parens也不需要。 –

+0

我们将在Unicode中得到它我不知道它是否可以与字符串相等,以避免它我转换为字符串 – Sandeep

+1

'u“foo”==“foo”'将会正常工作,如果没有ascii字符的名称然后调用str会出错。 –

您的描述我需要获取tag1后面的所有tag2与some_text_1,并在下一个tag2之前。基本上等同于在文本some_text_的任何tag1之后获得第一个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