Python 使用BeautifulSoup删除HTML表

Python 使用BeautifulSoup删除HTML表,python,html,pandas,beautifulsoup,html-table,Python,Html,Pandas,Beautifulsoup,Html Table,我正试图从英国《金融时报》网站上的一张表格中提取数据,但我的代码无法正常工作。我在这里已经讨论了关于堆栈溢出的其他类似问题,虽然它们有所帮助,但让代码正常工作超出了我的能力 我正在寻找一个表并输出到一个dict列表,或者一个dict的dict,然后将其放入一个数据帧中 为清晰起见,请编辑: 我想: 擦桌子 去掉html标记 在什么地方传回口述 每行的第一个单元格是键,其余的是 钥匙 到目前为止,我可以做(1),(2)我认为更多的是清理工作,不应该太难,(3)是我有问题的地方。有些行只包含一个条目

我正试图从英国《金融时报》网站上的一张表格中提取数据,但我的代码无法正常工作。我在这里已经讨论了关于堆栈溢出的其他类似问题,虽然它们有所帮助,但让代码正常工作超出了我的能力

我正在寻找一个表并输出到一个dict列表,或者一个dict的dict,然后将其放入一个数据帧中

为清晰起见,请编辑:

我想:

  • 擦桌子
  • 去掉html标记
  • 在什么地方传回口述 每行的第一个单元格是键,其余的是 钥匙
  • 到目前为止,我可以做(1),(2)我认为更多的是清理工作,不应该太难,(3)是我有问题的地方。有些行只包含一个条目,因为它们是节标题,但在html中没有这样标记,因此我在其他答案中看到的标准dict理解要么返回错误,因为key没有值,要么将第一个条目设置为所有其余数据的键

    桌子是空的

    到目前为止,我的代码是:

    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]
    
    这与我想要的非常接近,结构几乎正确,但从方括号的位置判断,这是将所有值ie
    1216
    作为单个单元格处理


    不管怎样,我会继续玩下去,努力让它发挥作用,但如果有人有任何建议,请让我知道

    这个问题与这个问题非常相似:@WarrenLamont:我同意这一点,但我面临的问题是如何迭代行和单元格以生成一个dict,我可以将其放入数据帧中。我不确定迭代应该在什么级别捕获“td”单元,也不确定如何将第一个单元作为每个dict的关键。亲爱的oboi,你现在找到解决方案了吗!?