Python 使用BeautifulSoup删除HTML表
我正试图从英国《金融时报》网站上的一张表格中提取数据,但我的代码无法正常工作。我在这里已经讨论了关于堆栈溢出的其他类似问题,虽然它们有所帮助,但让代码正常工作超出了我的能力 我正在寻找一个表并输出到一个dict列表,或者一个dict的dict,然后将其放入一个数据帧中 为清晰起见,请编辑: 我想:Python 使用BeautifulSoup删除HTML表,python,html,pandas,beautifulsoup,html-table,Python,Html,Pandas,Beautifulsoup,Html Table,我正试图从英国《金融时报》网站上的一张表格中提取数据,但我的代码无法正常工作。我在这里已经讨论了关于堆栈溢出的其他类似问题,虽然它们有所帮助,但让代码正常工作超出了我的能力 我正在寻找一个表并输出到一个dict列表,或者一个dict的dict,然后将其放入一个数据帧中 为清晰起见,请编辑: 我想: 擦桌子 去掉html标记 在什么地方传回口述 每行的第一个单元格是键,其余的是 钥匙 到目前为止,我可以做(1),(2)我认为更多的是清理工作,不应该太难,(3)是我有问题的地方。有些行只包含一个条目
from bs4 import BeautifulSoup
import urllib2
import lxml
soup = BeautifulSoup(urllib2.urlopen('http://markets.ft.com/research/Markets/Tearsheets/Financials?s=CLLN:LSE&subview=BalanceSheet').read())
table = soup.find('table', {'data-ajax-content' : 'true'})
for row in table.findAll('tr'):
for cell in row.findAll('td'):
print cell.findAll(text = True)
这让我得到了这种输出:
[u'Fiscal data as of Dec 31 2013']
[u'2013']
[u'2012']
[u'2011']
[u'ASSETS']
[u'Cash And Short Term Investments']
[u'416']
[u'660']
[u'495']
我试过:
rows = iter(table)
headers = [col.text for col in next(rows)]
for row in rows:
values = [col.text for col in row]
print dict(zip(headers, values))
这可能有效,但我得到:
urllib2.HTTPError:HTTP错误407:需要代理授权
我想这是因为我支持一个公司代理
编辑:
我在家里试过上面的代码,结果是:
{u'截至2012年12月31日的财务数据:u'资产'}{u'截至2012年12月31日的财政数据:u'负债'}
{u'截至2011年12月31日的财务数据:u'股东权益} 这是诱人的接近,但只抓住了每个部分的第一行 非常感谢您的帮助。我是python新手,所以如果您有时间解释您的答案,我也会非常感激 编辑: 我读了更多的书,尝试了更多的东西:
table = soup.find('table', {'data-ajax-content' : 'true'})
rows = table.findAll('tr')
dict_for_series = {row[0]:row[1:] for row in rows}
print dict_for_series
其结果是:
{<tr><td class="label">Fiscal data as of Dec 31 2013</td><td>2013</td><td>2012</td><td>2011</td></tr>: [<tr class="section even"><td colspan="4">ASSETS</td></tr>, <tr class="odd"><td class="label">Cash And Short Term Investments</td><td>416</td><td>660</td><td>495</td></tr>, <tr class="even"><td class="label">Total Receivables, Net</td><td>1,216</td><td>1,122</td><td>1,102</td></tr>, <tr class="odd"><td class="label">Total Inventory</td><td>49</td><td>55</td><td>72</td><
0
<td class="label">Fiscal data as of Dec 31 2013</td> [<td>2013</td>, <td>2012</td>, <td>2011</td>]
<td colspan="4">ASSETS</td> []
<td class="label">Cash And Short Term Investments</td> [<td>416</td>, <td>660</td>, <td>495</td>]
<td class="label">Total Receivables, Net</td> [<td>1,216</td>, <td>1,122</td>, <td>1,102</td>]
其结果是:
{<tr><td class="label">Fiscal data as of Dec 31 2013</td><td>2013</td><td>2012</td><td>2011</td></tr>: [<tr class="section even"><td colspan="4">ASSETS</td></tr>, <tr class="odd"><td class="label">Cash And Short Term Investments</td><td>416</td><td>660</td><td>495</td></tr>, <tr class="even"><td class="label">Total Receivables, Net</td><td>1,216</td><td>1,122</td><td>1,102</td></tr>, <tr class="odd"><td class="label">Total Inventory</td><td>49</td><td>55</td><td>72</td><
0
<td class="label">Fiscal data as of Dec 31 2013</td> [<td>2013</td>, <td>2012</td>, <td>2011</td>]
<td colspan="4">ASSETS</td> []
<td class="label">Cash And Short Term Investments</td> [<td>416</td>, <td>660</td>, <td>495</td>]
<td class="label">Total Receivables, Net</td> [<td>1,216</td>, <td>1,122</td>, <td>1,102</td>]
0
截至2013年12月31日的财务数据[2013、2012、2011]
资产[]
现金和短期投资[41660495]
净应收账款总额[12161122,1102]
这与我想要的非常接近,结构几乎正确,但从方括号的位置判断,这是将所有值ie1216
作为单个单元格处理
不管怎样,我会继续玩下去,努力让它发挥作用,但如果有人有任何建议,请让我知道 这个问题与这个问题非常相似:@WarrenLamont:我同意这一点,但我面临的问题是如何迭代行和单元格以生成一个dict,我可以将其放入数据帧中。我不确定迭代应该在什么级别捕获“td”单元,也不确定如何将第一个单元作为每个dict的关键。亲爱的oboi,你现在找到解决方案了吗!?