如何用Beautiful Soup打印表格行的所有单元格内容
问题:爬取含锚点的表格单元格时,BeautifulSoup返回None的解决办法
我最近刚开始学BeautifulSoup,练手爬了ESPN的一个NBA球员幻想排名表格页面。现在能正常打印整行内容,但单独提取每个单元格文本时,带锚点的单元格用cell.string会返回None,这可把我难住了。
我的代码是这样的:
from bs4 import BeautifulSoup import urllib2 import re if __name__ == '__main__': url = "http://www.espn.com/espn/print?id=20443164" resp = urllib2.urlopen(url) soup = BeautifulSoup(resp.read()) table = soup.find_all("table") mytable = table[2] rows = mytable.findChildren(['th','tr']) print rows for row in rows: cells = row.findChildren('td') for cell in cells: # print cell.string # 这行有问题 print cell # 这行能输出完整内容
用print cell能输出带<td>标签的完整内容,但print cell.string在有锚点的单元格位置就返回None,请问怎么去掉<td>标签,同时完整显示第一个单元格的内容?
解决办法
这问题我之前也碰到过!原因很简单:cell.string只在当前标签没有子标签,或者只有一个纯文本子节点的时候才会返回文本内容。如果单元格里还有<a>这样的子标签,string就会返回None,因为它不知道该取哪个子节点的文本。
给你几个靠谱的解决方法:
1. 用get_text()方法(最推荐)
这个方法会自动提取当前标签及其所有子标签里的文本内容,还能帮你处理空格问题:
for cell in cells: print cell.get_text(strip=True) # strip=True会去掉文本前后的空白字符
如果单元格里有多个文本片段,还可以指定分隔符,比如cell.get_text(separator=' ', strip=True),把零散的文本用空格连起来。
2. 先找到子标签再取文本
如果你只需要<a>标签里的文本,可以先定位到<a>再用string:
for cell in cells: anchor = cell.find('a') if anchor: print anchor.string.strip() else: print cell.string.strip() if cell.string else ''
这种方法适合你明确知道要提取子标签内容的场景,但要记得加判断,避免找不到<a>标签时报错。
3. 用stripped_strings生成器
这个生成器会遍历标签下所有非空白的文本片段,你可以把它们拼接起来:
for cell in cells: print ''.join(cell.stripped_strings)
效果和get_text(strip=True)差不多,适合需要自定义文本拼接逻辑的情况。
把你的代码改成用get_text()之后,就能完美输出每个单元格的纯文本内容啦!
内容的提问来源于stack exchange,提问作者Classified
相关产品推荐
相关产品推荐

