代码之家  ›  专栏  ›  技术社区  ›  Wayne Werner

漂亮的汤还是regex html表到数据结构?

  •  0
  • Wayne Werner  · 技术社区  · 14 年前

    我有一个HTML表,我正试图从中分析信息。但是,有些表跨越多行/多列,所以我想做的是使用类似于beautifulsoup的东西将表解析为某种类型的python结构。我是 思考 只是使用一个列表,这样我就可以

    <tr>
      <td>1,1</td>
      <td>1,2</td>
    </tr>
    <tr>
      <td>2,1</td>
      <td>2,2</td>
    </tr>
    

    进入之内

    [['1,1', '1,2'],
     ['2,1', '2,2']]
    

    我认为这应该是相当直接的。但是,也有一些轻微的并发症,因为有些细胞跨越多行/列。另外还有很多完全不必要的信息:

        <td ondblclick="DoAdd('/student_center/sc_all_rooms/d05/09/2010/editformnew?display=W&amp;style=L&amp;positioning=A&amp;adddirect=yes&amp;accessid=CreateNewEdit&amp;filterblock=N&amp;popeditform=yes&amp;returncalendar=student_center/sc_all_rooms')"
         class="listdefaultmonthbg" 
         style="cursor:crosshair;" 
         width="5%" 
         nowrap="1" 
         rowspan="1">
           <a class="listdatelink" 
              href="/student_center/sc_all_rooms/d05/09/2010/edit?style=L&amp;display=W&amp;positioning=A&amp;filterblock=N&amp;adddirect=yes&amp;accessid=CreateNewEdit">Sep 5</a>
        </td>
    

    代码看起来更糟。我真正需要的是:

    <td rowspan="1">Sep 5</td>
    

    两行之后,有一个行跨度为17的。对于多行跨度,我想应该是这样的:

    <tr>
      <td rowspan="2">Sep 5</td>
      <td>Some event</td>
    </tr>
    <tr>
      <td>Some other event</td>
    </tr>
    

    结果会是这样:

    [["Sep 5", "Some event"],
     [None, "Some other event"]]
    

    页面上有多个表,我已经可以找到我想要的表了,我只是不知道如何解析我需要的信息。我知道我可以使用beautfulsoup来“renderContents”,但在某些情况下,我需要去掉链接标记(同时保留文本)。

    我在想这样一个过程:

    1. 查找表
    2. 统计表中的行数( len(table.findAll('tr')) ?)
    3. 创建列表
    4. 将表解析为列表(BeautifulSoup语法???)
    5. ????
    6. 利润!(嗯,这是一个纯粹的内部程序,所以不是真的…)
    2 回复  |  直到 14 年前
        1
  •  2
  •   Meitham    14 年前

    最近在LinkedIn上有一个关于python组的讨论,关于类似的问题,显然lxml是HTML页面最推荐的python解析器。

    http://www.linkedin.com/groupItem?view=&gid=25827&type=member&item=27735259&qid=d2948a0e-6c0c-4256-851b-5e7007859553&goback=.gmp_25827

        2
  •  0
  •   razpeitia    14 年前

    您可能需要用一些属性、ID或名称来标识表。

    from BeautifulSoup import BeautifulSoup
    
    data = """
    <table>
    <tr>
      <td>1,1</td>
      <td>1,2</td>
    </tr>
    <tr>
      <td>2,1</td>
      <td>2,2</td>
    </tr>
    </table>
    """
    
    soup = BeautifulSoup(data)
    
    for t in soup.findAll('table'):
        for tr in t.findAll('tr'):
            print [td.contents for td in tr.findAll('td')]
    

    编辑:如果有多个链接,程序应该怎么做?

    前任:

    <td><a href="#">A</a> B <a href="#">C</a></td>