使用 Soup 获取标签名称和文本

Get tag name and text with Soup

我尝试使用 BeautifulSoup 从 header 中获取文本。 header 在他的属性中是动态的。这就是为什么我将 html-code 最小化的原因。 我想获取文本和相应的 tag-name。 我试过这个:

 for element in header.find_all(string = True):
                
                if len(element.text.strip('\n')) > 0:
                    print(element)
                    a = header.find_all(text = element.text)
                    print(a + " " + a.text.strip('\n'))

但是打印输出的只是文本,而不是带文本的标签。 我该如何解决?

谢谢转发

第一个:

<header>

    <div>
        <h2>
            <span>
                Text A here</span>
            <span><span>Text B Here <span>
                    </span>
        </h2>
        <div>
            <div>
                <span>
                    <div>
                    </div>
                </span>
            </div>
            <div>
                Text C Here
                <a>
                    Text C Here</a>
            </div>
        </div>
        <div>

            <a>
                Text D</a>
        </div>
        <div>
            Text E
        </div>
    </div>
    </div>
</header>

第二个例子:

<header>
    <div>
        <div>
            <h2>
                <span>
                    Text A
                </span>
                <span><span>Text B</span>
                </span>
            </h2>
            <div>
                Text C
            </div>
        </div>
    </div>
</header>

第 3 个示例:

<header>
    <div>
        <div>
            <h2>
                <span>
                    Text A
                </span>
                <span>
                    <span>
                        <span><svg>
                                <g>
                                    <rect></rect>
                                    <path></path>
                                    <path></path>
                                </g>
                            </svg>
                        </span>
                    </span><span>Text B</span>
                </span>
            </h2>
            <div>
                Text C
            </div>
            <div>
                Text D
                <a>
                    Text E</a><span>Text F </span>
                <a>
                    Text G</a><span> Text H </span>
                <a>
                    Text I</a>
            </div>
        </div>
    </div>
</header>

使用element.parent.name获取标签名称。

根据你的例子1:

    from bs4 import BeautifulSoup

    html='''<header>
    
        <div>
            <h2>
                <span>
                    Text A here</span>
                <span><span>Text B Here <span>
                        </span>
            </h2>
            <div>
                <div>
                    <span>
                        <div>
                        </div>
                    </span>
                </div>
                <div>
                    Text C Here
                    <a>
                        Text C Here</a>
                </div>
            </div>
            <div>
    
                <a>
                    Text D</a>
            </div>
            <div>
                Text E
            </div>
        </div>
        </div>
    </header>'''
    
    header=BeautifulSoup(html.strip(), 'html.parser')
    for element in header.find_all(string = True):
                    
        if len(element.text.strip('\n')) > 0:
            print(element.strip())
            a = header.find(text = element.text)
            print(a.parent.name + " " + a.text.strip())

输出:

Text A here
span Text A here
Text B Here
span Text B Here
Text C Here
div Text C Here
Text C Here
a Text C Here
Text D
a Text D
Text E
div Text E

示例 3:

html='''<header>
    <div>
        <div>
            <h2>
                <span>
                    Text A
                </span>
                <span>
                    <span>
                        <span><svg>
                                <g>
                                    <rect></rect>
                                    <path></path>
                                    <path></path>
                                </g>
                            </svg>
                        </span>
                    </span><span>Text B</span>
                </span>
            </h2>
            <div>
                Text C
            </div>
            <div>
                Text D
                <a>
                    Text E</a><span>Text F </span>
                <a>
                    Text G</a><span> Text H </span>
                <a>
                    Text I</a>
            </div>
        </div>
    </div>
</header>'''

header=BeautifulSoup(html.strip(), 'html.parser')
for element in header.find_all(string = True):
                
    if len(element.text.strip('\n')) > 0:
        print(element.strip())
        a = header.find(text = element.text)
        print(a.parent.name + " " + a.text.strip())

输出:

Text A
span Text A
Text B
span Text B
Text C
div Text C
Text D
div Text D
Text E
a Text E
Text F
span Text F
Text G
a Text G
Text H
span Text H
Text I
a Text I