Python BeautifulSoup从保存的HTML网页中提取表格

时间:2015-07-22 04:38:50

标签: python html beautifulsoup extraction

我尝试使用Python 2.7 + Windows从保存的HTML网页中提取数据。

有多个已保存的HTML网页,它们相似,每个网页都包含一个包含5列的表格。行数不固定。

源代码如下:

text = '''

<table id="MainTable" class="KTable" cellspacing="0" cellpadding="0" border="0">
            <tbody><tr>
                <td class="KGI"></td><td></td><td></td><td></td><td></td><td></td>
            </tr><tr id="ASPxJ1_DXGroupRowExp0" class="KGroupRow">
                <td class="K"><img class="dxJ_gvExpandedButton" src="/DXR.axd?r=1_19-RP" alt="[Collapse]"></td><td class="K" colspan="5">Supplier Code  (Count=6, <span class="grid_sumlabel">Record Count:</span><span class="grid_sumdata">86</span>) (next page)</td>
            </tr><tr id="Row1" class="row_data">
                <td class="IndentD">Â&nbsp;</td><td class="apv"><a class="dxeHyperlink" href="admin.aspx">3617</a></td><td class="class0">German</td><td class="apv">EU</td><td class="apv" align="right">2012</td><td class="apv" align="right">2013</td>
            </tr><tr id="Row2" class="row_data row_dataAlt aspxgridAltStyle">
                <td class="IndentD">Â&nbsp;</td><td class="apv"><a class="dxeHyperlink" href="admin.aspx">3617</a></td><td class="class0"><a href="ad.aspx">Belgium</a></td><td class="apv">EU</td><td class="apv" align="right">2014</td><td class="apv" align="right">2015</td>
            </tr><tr id="Row3" class="row_data">
                                                        …
                                                        …
                                                        …
                                                        …
                                                        …
            </tr><tr id="Row50" class="row_data">
            </tr>
        </tbody></table>


'''

我想要的是获取表格内容并将其保存/存储在.xls文件中。

我的工作是:

soup = BeautifulSoup(text)
aa = soup.find_all('table')[0].tbody.find_all('tr')

for a in aa:
    print a.text

它提供所有内容,但全部为1行。

我试过了:

aa = soup.find_all(id = 'MainTable')

for a in aa:
    for b in a.find_all(id = 'Row2'):
        print b.text

它给出了特定行的内容,但仍然是1行。

3617BelgiumEU20142015

html文件中的这些不足且不确定的行也是一个问题。

我想要的是“3617”,“比利时”,“欧盟”,“2014”和“2015”,以便我可以将它们保存在.xls文件中。

很好地提取表格的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您应该遍历每行的td元素:

for row in soup.select("table#MainTable tr[id^=Row]"):
    for cell in row.find_all("td"):
        print cell.text

请注意,我使用CSS selector来查找表格行。

答案 1 :(得分:0)

在第二次尝试中,您可以尝试find_all获取每行中的所有<td>,然后循环显示它们的文字 -

>>> aa = soup.find_all(id = 'MainTable')
>>> for a in aa:
...     for b in a.find_all(id = 'Row2'):
...        for c in b.find_all('td'):
...           print(c.text)
...
A 
3617
Belgium
EU
2014
2015

答案 2 :(得分:0)

find_all()可以使用参数text=True

搜索所有文本
e.find_all(text=True)

在你的代码上

aa = soup.find_all(id = 'MainTable')
for a in aa:
    for b in a.find_all(id = 'Row2'):
        print b.find_all(text=True)

将在下面打印:

[u'\n', u'\xc2\xa0', u'3617', u'Belgium', u'EU', u'2014', u'2015', u'\n']

请注意,\n也是text,因此您应该将数据修改为没有\n或将其过滤掉。