如何在另外两个标签之间找到一个标签?

时间:2016-09-15 09:22:19

标签: python python-3.x beautifulsoup

我的文档结构如下:

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

我需要获取所有tag2tag1 some_text_1之后tag1以及下一个<ol> <li> <label for=""><input type="checkbox" name="filter-by-name" value="pete"> Pete</label> </li> <li> <label for=""><input type="checkbox" name="filter-by-name" value="Jakov">Jakov</label> </li> 之前的实例。

2 个答案:

答案 0 :(得分:1)

您的描述我需要获取tag1之后的所有tag2实例和some_text_1以及下一个tag2之前。基本上等同于在任何带有文本{{的tag1之后获取第一个tag2 1}}。

所以找到带有特定文字的some_text_并检查下一个兄弟标记是tag1's,如果它是拉标签2:

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

如果您确实想要专门在两个标签之间找到标签,可以使用this answer中的逻辑。

答案 1 :(得分: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)

希望这能解决问题,但我不认为这是一种有效的方法。如果您熟悉它们,可以使用正则表达式。