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)
这不符合任何东西。正确的语法是什么?
我认为这不能用单一的表达来完成。
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