如何使用urllib和BeautifulSoup爬取网页文本,无法获取b标签后续内容怎么办
爬取IMSDB剧本无法获取b标签后续文本解决方案
故障根因
- 目标网站剧本采用固定排版逻辑:角色名称单独包裹在
<b>标签内,角色对应的台词属于<b>标签的后续同级文本节点,并不包含在<b>标签内部,因此直接读取b_tag[索引].text只能获取到角色名称,无法拿到后续台词内容。 - 返回内容前的大量空白是网页源码本身的排版缩进导致的,调用
strip()方法即可快速去除首尾空白字符。
修正代码示例
import urllib.request as ureq from bs4 import BeautifulSoup as bs url = 'https://imsdb.com/scripts/Pulp-Fiction.html' # 用with语句自动管理连接,无需手动关闭 with ureq.urlopen(url) as htmlfile: htmltext = htmlfile.read() html_soup = bs(htmltext, 'html.parser') b_tag = html_soup.find_all('b') # 取第10个b标签对应的角色和台词 target_b = b_tag[10] # 清理角色名首尾空白 role = target_b.text.strip() # 获取后续非空的同级文本节点即为台词 dialogue = target_b.next_sibling.strip() # 输出结果 print(f"角色:{role}") print(f"台词:{dialogue}")
补充说明
- 如果首次调用
next_sibling返回空值,说明<b>标签和台词之间存在空白文本节点,多调用一次next_sibling即可,也可以直接用target_b.find_next_sibling(text=True, strip=True)自动过滤空白节点,直接获取台词内容。 - 旧版BeautifulSoup中
findAll方法已更名为find_all,建议使用新写法保证兼容性。
内容的提问来源于stack exchange,提问作者Shash
相关产品推荐
相关产品推荐

