在BeautifulSoup中,如何搜索包含文本但又具有特定类祖先的元素?

时间:2019-12-10 14:57:26

标签: python python-3.x beautifulsoup html-parsing

我正在将BeautifulSoup 4与Python 3.7一起使用。我想找到一个元素,该元素的元素中包含文本“ points”,但还具有其类属性包含“ article”的祖先DIV。我想出了如何搜索带有文本的元素...

points_elt = soup.find_all(text=re.compile(' points'))[0]

但是我不知道如何扩展上面的内容以包含带有该文本的元素,这些元素还包括具有“ article”类的祖先。这是我要查找的元素的一个示例。

<div class="article class2">
    ... other elements ...
    <span class="outerSpan">
        <span class="innerSpan">2000 points</span>
    </span>
   ... other element closing tags ...
</div>

这是应该在...上运行的另一个示例

<div class="article class7">
    <p>
        <div class="abc">
            <span class="outerSpan">
                <span>8000 points</span>
            </span>             
        </div>
    </p>
</div>

3 个答案:

答案 0 :(得分:0)

from bs4 import BeautifulSoup
import re

data = """
<div class="article class2">
    <span class="outerSpan">
        <span class="innerSpan">2000 points</span>
    </span>
</div>
"""

soup = BeautifulSoup(data, 'html.parser')
for item in soup.findAll(text=re.compile('points$')):
    print(item)

输出:

2000 points
from bs4 import BeautifulSoup


data = """
<div class="article class2">
    <span class="outerSpan">
        <span class="innerSpan">2000 points</span>
    </span>
</div>
"""

soup = BeautifulSoup(data, 'html.parser')
for item in soup.findAll('span', {'class': 'innerSpan'}):
    print(item.text)

输出:

2000 points

答案 1 :(得分:0)

您可以使用css选择器并检查要查找的字符串。

html='''<div class="article class2">
    <span class="outerSpan">
        <span class="innerSpan">2000 points</span>
    </span>
</div>
'''

soup=BeautifulSoup(html,'html.parser')
for item in soup.select('.article .innerSpan'):
   if 'points' in item.text:
       print(item.text)

或者您可以使用它。

soup=BeautifulSoup(html,'html.parser')
for item in soup.select('.article:contains(points)'):
   print(item.text.strip())

答案 2 :(得分:0)

span = soup.find_all('span')
if 'points' in span[1].text:
    div = span[1].parent.parent
    print(div)

span变量具有所有span元素,我们正在遍历到HTML标记的父元素。考虑到这始终是HTML的格式。