使用BeautifulSoup抓取选举数据时无法获取候选人姓名的问题
解决方法:处理嵌套标签的文本提取问题
问题出在BeautifulSoup的.string属性特性上:只有当标签没有子标签,或者仅包含一个纯文本节点时,.string才会返回有效内容。你的候选人姓名放在td下的span子标签里,这时候用.string自然会返回None。
给你几个实用的解决办法:
方法1:直接提取标签下所有文本(最省心)
用.get_text()方法替代.string,它会自动抓取标签及其所有子标签里的文本内容,还可以用strip=True去掉多余的空格和换行:
# 提取单个候选人姓名 first_candidate_name = first_data_row.find_all('td')[0] print(first_candidate_name.get_text(strip=True)) # 处理整行数据的列表推导式 [row_data.get_text(strip=True) for row_data in first_data_row.find_all('td')]
这样应该能拿到你要的候选人姓名,而不是None。
方法2:精准定位子标签提取
如果你确定候选人姓名一定在span标签里,可以直接定位这个子标签再取内容:
# 提取单个候选人姓名 first_candidate_span = first_data_row.find_all('td')[0].find('span') print(first_candidate_span.string) # 或者 first_candidate_span.get_text(strip=True) # 整行处理的话,可以针对性处理前两个td tds = first_data_row.find_all('td') processed_row = [ tds[0].find('span').get_text(strip=True), tds[1].find('span').get_text(strip=True), tds[2].get_text(strip=True), tds[3].get_text(strip=True) ]
补充验证小技巧
如果不确定标签结构,先打印出标签的完整内容看看:
print(first_candidate_name.prettify())
这样能清楚看到td里的嵌套结构,方便调整提取逻辑。
内容的提问来源于stack exchange,提问作者b_shumate052
相关产品推荐
相关产品推荐

