【问题标题】:BeautifulSoup or regex HTML table to data structure?BeautifulSoup 或正则表达式 HTML 表到数据结构?
【发布时间】:2010-09-16 14:28:20
【问题描述】:

我有一个 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 来“渲染内容”,但在某些情况下,我需要去掉链接标签(同时保留文本)。

我在想一个类似这样的过程:

  1. 查找表
  2. 计算表中的行数 (len(table.findAll('tr'))?)
  3. 创建列表
  4. 将表格解析为列表(BeautifulSoup 语法???)
  5. ???
  6. 利润! (嗯,这是一个纯粹的内部程序,所以不是真的......)

【问题讨论】:

    标签: python regex beautifulsoup


    【解决方案1】:

    最近在linkedin 上的python 组上讨论了一个类似的问题,显然lxml 是最推荐用于html 页面的pythonic 解析器。

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

    【讨论】:

    • lxml 到目前为止使用起来要容易得多。
    【解决方案2】:

    您可能需要使用一些属性、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>
    

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 2016-05-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多