【问题标题】:Import rows of a table from html file as a list in python从html文件中导入表的行作为python中的列表
【发布时间】:2013-02-04 20:28:30
【问题描述】:

我是一个 python 新手,我遇到了一些我无法解决的问题(即使在大约一百万个 Google 搜索之后)。

我有超过 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 标记。我也尝试了其他几件事,但我似乎被卡住了。如有任何建议,我将不胜感激。

【问题讨论】:

    标签: python html python-2.7 beautifulsoup


    【解决方案1】:

    这有点草率,但可以解决问题。

    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)
    

    【讨论】:

    • 假设 HTML 文件具有给定的行结构是个坏主意
    • 这对我很有用,即使它有点乱。但我不明白为什么start = max(line.find('FORWARD'),line.find('REVERSE')) 行有效。 print(start) 返回值 -1,根据 python 文档表明它找不到字符串 'FORWARD' 或字符串 'REVERSE'
    • start == -1 意味着 FORWARD 和 REVERSE 都不在行中。如果其中任何一个在该行中,则 start 设置为其中一个出现的第一个索引。
    • 哦,我明白了。我正在运行 start = ... 为错误的行,所以这就是为什么我总是得到 -1 回来。当你做得对时更有意义......谢谢!
    【解决方案2】:

    根据您的示例数据,您可以使用以下代码将第一行作为列表获取:

    >>> 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']
    

    【讨论】:

      【解决方案3】:

      试试这样的:

      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' 等标签的错误。不过,这应该可以帮助您入门。

      【讨论】:

      • 我很抱歉。您的答案看起来与我发布的答案非常相似,我正在尝试编辑我的答案。我不小心编辑了你的。
      • @Eric 不用担心。回滚。
      猜你喜欢
      • 2016-02-08
      • 2012-05-04
      • 2014-09-12
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多