从HTML文件中以列表形式导入表格行在Python中

2 投票
3 回答
1528 浏览
提问于 2025-04-17 16:26

我是一名Python新手,遇到了一些问题,怎么也解决不了(即使我已经在谷歌上搜索了无数次)。

我有超过100个HTML文件,每个文件里都有几个表格。最终,我想把每个文件中第一个HTML表格的每一行提取出来,变成Python中的一个列表,但不想要HTML标签。现在我第一步是想搞清楚怎么去掉HTML标签,然后再想办法把这些内容导入成一个列表。

我的HTML文件看起来是这样的:

 <tr><td>1</td><td>FORWARD</td><td>72</td><td>20</td><td>60.29</td><td>55.00</td><td>5.00</td><td>3.00</td></tr>
 <tr><td>&nbsp;</td><td>REVERSE</td><td>258</td><td>20</td><td>60.11</td><td>45.00</td><td>4.00</td><td>3.00</td></tr>
 <tr><td>2</td><td>FORWARD</td><td>77</td><td>20</td><td>60.08</td><td>50.00</td><td>5.00</td><td>2.00</td></tr>
 <tr><td>&nbsp;</td><td>REVERSE</td><td>258</td><td>20</td><td>60.11</td><td>45.00</td><td>4.00</td><td>3.00</td></tr>

我想要的是把每一行的值放到列表里,类似于你手动做的时候得到的结果:

 row1 = [FORWARD, 72, 20, 60.29, 55.0, 5.00, 3.00]. 

我听说BeautifulSoup可能会有帮助,所以我试了一下:

 from bs4 import BeautifulSoup

 def removeTags(html, *tags):
     soup = BeautifulSoup(html)
     for tag in tags:
         for tag in soup.findAll(tag):
             tag.replaceWith("")
     return soup


 testhtml = open('myfile.html', 'r')

 print removeTags(testhtml, 'tr', 'td')

但这似乎把表格里的所有信息都删掉了,而不仅仅是HTML标签。我还尝试了其他几种方法,但我似乎卡住了。任何建议我都会很感激。

3 个回答

0

根据你提供的样本数据,你可以用下面的代码把第一行数据提取成一个列表:

>>> list(soup.find('tr').strings)
[u'1', u'FORWARD', u'72', u'20', u'60.29', u'55.00', u'5.00', u'3.00']
0

试试这样做:

soup = BeautifulSoup(html)
table = soup.find('table')
rows = table.findAll('tr')
for row in rows:
    print [col.string for col in row.findAll('td')]

补充说明:如果你想要得到数字,可以对 col.string 使用 float,但这样会对 'FORWARD' 等标签报错。不过,这个方法应该能帮助你入门。

2

这段代码有点儿粗糙,但能达到目的。

with open('htmlfile.html','r') as file:
  rows = []
  for line in file:
    start = max(line.find('FORWARD'),line.find('REVERSE'))
    rows.append(line[start:].replace('<','').replace('>','').replace('/','').replace('td',' ').replace('tr',' ').strip().split('  '))
print(rows)

撰写回答