Beautiful Soup新手求助:如何从目标HTML中提取多位演员姓名?
问题
我从IMDB获取了一段HTML代码,想从中提取文本元素:
<p class=""> Director: <a href="/name/nm0001104/">Frank Darabont</a> <span class="ghost">|</span> Stars: <a href="/name/nm0000209/">Tim Robbins</a>, <a href="/name/nm0000151/">Morgan Freeman</a>, <a href="/name/nm0348409/">Bob Gunton</a>, <a href="/name/nm0006669/">William Sadler</a> </p>
目前我能用这段代码提取导演姓名:
html_code.find('a').text
但没法提取Tim Robbins、Morgan Freeman这些演员的姓名。作为Beautiful Soup新手,请问怎么用类似语法提取这些演员姓名?
解决方案
1. 提取所有姓名(包含导演)
find('a')只会返回第一个匹配的标签,所以只能拿到导演。要获取所有名字,换成find_all('a')即可,它会返回所有符合条件的标签列表:
# 获取所有a标签元素 all_name_tags = html_code.find_all('a') # 遍历列表提取每个标签的文本 all_names = [tag.text for tag in all_name_tags] # 结果:['Frank Darabont', 'Tim Robbins', 'Morgan Freeman', 'Bob Gunton', 'William Sadler']
2. 单独提取演员姓名
如果只需要演员的名字,借助第一个<a>是导演的结构特点,对列表做切片就行:
all_name_tags = html_code.find_all('a') # 从索引1开始取后面的元素,也就是所有演员的标签 actor_names = [tag.text for tag in all_name_tags[1:]] # 结果:['Tim Robbins', 'Morgan Freeman', 'Bob Gunton', 'William Sadler']
3. 更稳定的定位(应对页面结构变化)
要是担心后续IMDB页面结构调整,第一个<a>不再是导演,也可以先定位到"Stars:"文本,再抓取它后面的<a>标签:
# 找到包含"Stars:"的文本节点 stars_label = html_code.find(text=lambda t: t and 'Stars:' in t.strip()) # 获取该节点之后的所有a标签 actor_tags = stars_label.find_next_siblings('a') actor_names = [tag.text for tag in actor_tags]
内容的提问来源于stack exchange,提问作者user10678782
相关产品推荐
相关产品推荐

