干得好:
data = []
table = soup.find('table', attrs={'class':'lineItemsTable'})
table_body = table.find('tbody')
rows = table_body.find_all('tr')
for row in rows:
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele]) # Get rid of empty values
这给了你:
[ [u'1359711259', u'SRF', u'08/05/2013', u'5310 4 AVE', u'K', u'19', u'125.00', u'$'],
[u'7086775850', u'PAS', u'12/14/2013', u'3908 6th Ave', u'K', u'40', u'125.00', u'$'],
[u'7355010165', u'OMT', u'12/14/2013', u'3908 6th Ave', u'K', u'40', u'145.00', u'$'],
[u'4002488755', u'OMT', u'02/12/2014', u'NB 1ST AVE @ E 23RD ST', u'5', u'115.00', u'$'],
[u'7913806837', u'OMT', u'03/03/2014', u'5015 4th Ave', u'K', u'46', u'115.00', u'$'],
[u'5080015366', u'OMT', u'03/10/2014', u'EB 65TH ST @ 16TH AV E', u'7', u'50.00', u'$'],
[u'7208770670', u'OMT', u'04/08/2014', u'333 15th St', u'K', u'70', u'65.00', u'$'],
[u'$0.00nnnPayment Amount:']
]
需要注意的几点:
- 上面输出的最后一行,付款金额不是表格的一部分,但表格的布局是这样的。您可以通过检查列表的长度是否小于 7 来将其过滤掉。
- 每行的最后一列必须单独处理,因为它是一个输入文本框。
更新的答案
如果程序员只对从网页中解析表格感兴趣,他们可以使用 pandas 方法
pandas.read_html
。假设我们要从网站中提取 GDP 数据表: https://worldpopulationreview.com/countries/countries-by-gdp/#worldCountries
然后以下代码完美地完成了这项工作(不需要漂亮的汤和花哨的 html):
仅使用pandas
使用 pandas 和 requests(更一般的情况)
所需模块
输出