如何用BeautifulSoup的find_all提取span标签中的‘1 baño’文本?
用BeautifulSoup提取span标签中的文本“1 baño”
给定的span标签包含SVG元素和目标文本,可通过以下方法用find_all定位后提取所需内容:
核心思路
由于span内部存在SVG子标签,直接调用.string会返回None(多子节点场景下无法直接获取文本),需通过文本提取方法过滤掉标签内容,保留纯文本。
代码实现
from bs4 import BeautifulSoup # 待解析的HTML内容 html = ''' <span> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" width="16" height="16" class="icon icon-small "> <path fill-rule="evenodd" d="M9 19.5V7.25A4.25 4.25 0 0113.25 3a1 1 0 010 2A2.25 2.25 0 0011 7.25V19.5h3a3.5 3.5 0 013.752-3.491 4.5 4.5 0 017.496 0A3.5 3.5 0 0129 19.5h2a1 1 0 010 2h-.8l.14 1.403a6 6 0 01-5.46 6.575l.569 1.706a1 1 0 11-1.898.632l-.683-2.051a1.001 1.001 0 01-.05-.265h-9.635a1.001 1.001 0 01-.05.265l-.684 2.051a1 1 0 11-1.898-.632l.569-1.705a6 6 0 01-5.46-6.576L5.8 21.5H5a1 1 0 010-2h4zm7 0h11a1.5 1.5 0 00-1.969-1.426l-.87.286-.361-.842a2.5 2.5 0 00-4.6 0l-.36.842-.871-.286A1.5 1.5 0 0016 19.5zm-8.19 2l-.16 1.602a4 4 0 003.98 4.398h12.74a4 4 0 003.98-4.398l-.16-1.602H7.81zm6.86-11.949a1 1 0 01-2 0V7.5a1 1 0 112 0v2.051zm3.12- 2.316a1 1 0 01-1.897.633l-.684-2.052a1 1 0 011.898-.632l.684 2.051z"></path> </svg> 1 baño </span> ''' # 初始化BeautifulSoup解析器 soup = BeautifulSoup(html, 'html.parser') # 方法1:使用find_all定位所有span,通过get_text提取并清理文本 spans = soup.find_all('span') for span in spans: # strip=True自动去除首尾空白和换行 target_text = span.get_text(strip=True) if target_text: print(target_text) # 输出:1 baño # 方法2:遍历span的子节点,筛选纯文本节点 for span in spans: for node in span.contents: # 筛选出非空的纯文本节点 if hasattr(node, 'string') and node.string.strip(): print(node.string.strip()) # 输出:1 baño
关键说明
find_all('span')会定位页面中所有span标签,若需更精准定位,可添加属性筛选(如find_all('span', class_='xxx'))。get_text(strip=True)会自动合并span内所有文本并去除多余空白,适合快速提取。- 若需精确控制文本来源,可遍历
contents属性筛选NavigableString类型的节点,避免意外提取其他子标签的文本。
内容的提问来源于stack exchange,提问作者Diego Fonseca
相关产品推荐
相关产品推荐

