Python BeautifulSoup 从保存的 HTML 网页中提取 table
Python BeautifulSoup to extract table from saved HTML webpages
我正在尝试使用 Python 2.7 + Windows.
从保存的 HTML 网页中提取数据
有多个已保存的 HTML 网页,它们相似且每个都包含一个 table 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">Â </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">Â </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>
'''
我想要的是将 table 内容和 put/save 它们放在 .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”、“Belgium”、“EU”、“2014”和“2015”,这样我就可以将它们保存在.xls文件中。
最好的提取 table 的方法是什么?
您应该为每一行迭代 td
个元素:
for row in soup.select("table#MainTable tr[id^=Row]"):
for cell in row.find_all("td"):
print cell.text
请注意,我使用 CSS selector 来定位 table 行。
在第二次尝试中,您可以尝试 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
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
或将其过滤掉。
我正在尝试使用 Python 2.7 + Windows.
从保存的 HTML 网页中提取数据有多个已保存的 HTML 网页,它们相似且每个都包含一个 table 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">Â </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">Â </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>
'''
我想要的是将 table 内容和 put/save 它们放在 .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”、“Belgium”、“EU”、“2014”和“2015”,这样我就可以将它们保存在.xls文件中。
最好的提取 table 的方法是什么?
您应该为每一行迭代 td
个元素:
for row in soup.select("table#MainTable tr[id^=Row]"):
for cell in row.find_all("td"):
print cell.text
请注意,我使用 CSS selector 来定位 table 行。
在第二次尝试中,您可以尝试 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
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
或将其过滤掉。