Python/BeautifulSoup - 无法匹配包含特定文本的标签

Hyp*_*ion 4 python beautifulsoup

我在 stackoverflow 上阅读了大量关于同一问题的文章,但没有人为我工作。

我需要选择的标签:

<p class="line">Actors: <a href="somelink">Actor 1</a></p>
Run Code Online (Sandbox Code Playgroud)

该页面充满了p标签,class="line"因此我尝试通过查找包含字符串“Actors:”的标签来匹配它:

data.find('p', attrs={'class':'line'}, text=re.compile(r'^Actors: $'))
Run Code Online (Sandbox Code Playgroud)

这不符合任何东西。正确的语法是什么?

djr*_*ero 5

我认为这不能用单一的表达来完成。

import re
from bs4 import BeautifulSoup

s="""
    <p class="line">Actors: <a href="somelink">Actor 1</a></p>
    <p class="line">Other: <a href="somelink">Stunt 0</a></p>
    <p class="line">Actors: <a href="somelink">Actor 3</a></p>
    <p class="role-line">Actors: <a href="somelink">Actor 4</a></p>
"""

soup = BeautifulSoup(s, 'html.parser')
Run Code Online (Sandbox Code Playgroud)

这项工作:

soup.findAll(attrs={'class':'line'})
Run Code Online (Sandbox Code Playgroud)

这个也是:

soup.findAll(string=re.compile(r'^Actors'))
Run Code Online (Sandbox Code Playgroud)

但两者结合起来不起作用,有错误还是不受支持,我不知道:

soup.findAll(attrs={'class':'line'}, string=re.compile(r'^Actors'))
Run Code Online (Sandbox Code Playgroud)

但你还有其他选择。

使用set交集:

set([node.parent for node in soup.findAll(string=re.compile(r'^Actors'))]) & 
set(soup.findAll(attrs={'class':'line'}))
Run Code Online (Sandbox Code Playgroud)

结果:

{<p class="line">Actors: <a href="somelink">Actor 3</a></p>,
 <p class="line">Actors: <a href="somelink">Actor 1</a></p>}
Run Code Online (Sandbox Code Playgroud)

使用findParents

[node.findParents('p', class_='line') for node in \
soup.findAll(string=re.compile(r'^Actors'))]
Run Code Online (Sandbox Code Playgroud)

结果:(需要一些过滤)

[[<p class="line">Actors: <a href="somelink">Actor 1</a></p>],
 [<p class="line">Actors: <a href="somelink">Actor 3</a></p>],
 []]
Run Code Online (Sandbox Code Playgroud)

使用循环和条件:

for p in [node.parent for node in soup.findAll(text=re.compile(r'^Actors'))]:
    if not 'line' in p.attrs['class']:
        continue
    print(p)
Run Code Online (Sandbox Code Playgroud)

结果:

<p class="line">Actors: <a href="somelink">Actor 1</a></p>
<p class="line">Actors: <a href="somelink">Actor 3</a></p>
Run Code Online (Sandbox Code Playgroud)

注:是BeautifulSoup 4.4+中的string新参数text