【问题标题】:beautifulSoup parsing tag table HTML, especially colspan and rowspanbeautifulSoup 解析标签表 HTML,尤其是 colspan 和 rowspan
【发布时间】:2012-11-07 05:00:51
【问题描述】:

我想问一下解析来自<table> 的值colspan 和rowspan。 比如这样:

<table cellpadding="2" cellspacing="2" border="1" width="50%">
<tbody>
  <tr>
    <td valign="top" rowspan="2" colspan="1" align="center">NO<br>
    </td>
    <td valign="top" rowspan="1" colspan="3" align="center">NAMA<br>
    </td>
    <td valign="top" rowspan="1" colspan="2" align="center">TELEPON<br>
    </td>
    <td valign="top" rowspan="2" colspan="1" align="center">KODE<br>
    </td>
  </tr>
  <tr>
    <td valign="top" align="center">DEPAN<br>
    </td>
    <td valign="top" align="center">TENGAH<br>
    </td>
    <td valign="top" align="center">BELAKANG<br>
    </td>
    <td valign="top" align="center">KODE<br>
    </td>
    <td valign="top" align="center">NO TLP<br>
    </td>
  </tr>
  <tr>
    <td valign="top" align="center">1<br>
    </td>
    <td valign="top">Ani<br>
    </td>
    <td valign="top">Tiara<br>
    </td>
    <td valign="top">Ramadika<br>
    </td>
    <td valign="top" align="center">021<br>
    </td>
    <td valign="top" align="center">8466729<br>
    </td>
    <td valign="top" align="center">17412<br>
    </td>
  </tr>
  <tr>
    <td valign="top" align="center">2<br>
    </td>
    <td valign="top">Dia<br>
    </td>
    <td valign="top">Andari<br>
    </td>
    <td valign="top">Putri<br>
    </td>
    <td valign="top" align="center">022<br>
    </td>
    <td valign="top" align="center">5930290<br>
    </td>
    <td valign="top" align="center">18291<br>
    </td>
  </tr>
  <tr>
    <td valign="top" align="center">3<br>
    </td>
    <td valign="top">Rangga<br>
    </td>
    <td valign="top">Dimas<br>
    </td>
    <td valign="top">Putra<br>
    </td>
    <td valign="top" align="center">023<br>
    </td>
    <td valign="top" align="center">8349829<br>
    </td>
    <td valign="top" align="center">13901<br>
    </td>
  </tr>
  <tr>
    <td valign="top" align="center">4<br>
    </td>
    <td valign="top">Niko<br>
    </td>
    <td valign="top">Reza<br>
    </td>
    <td valign="top">Anggara<br>
    </td>
    <td valign="top" align="center">024<br>
    </td>
    <td valign="top" align="center">4284982<br>
    </td>
    <td valign="top" align="center">21211<br>
    </td>
  </tr>

</tbody>  
</table>

我使用python进行HTML解析,像这样:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html)
t = soup.find("table")
dat = [ map(str, row.findAll('td', { 'rowspan' })) for row in t.findAll("tr") ]
print dat[1]

但是,我仍然很困惑如何获得colspan 的值。

我已经有了解析标签表,但是不知道如何获取colspan属性的值。我尝试过使用正则表达式,但没有成功。

【问题讨论】:

    标签: html beautifulsoup html-table


    【解决方案1】:

    我推荐使用CSS selectors:

    from bs4 import BeautifulSoup
    s = open("colspan_rowspan.html").read()
    soup = BeautifulSoup(s)
    
    # select all td children of tr that have both colspan & rowspan
    tags = soup.select('tr td[colspan,rowspan]')
    
    # print out the values, for example:
    print [(td['colspan'], td['rowspan']) for tags]
    
    # will return [('1', '2'), ('3', '1'), ('2', '1'), ('1', '2')]
    

    【讨论】:

    • 我试过你的代码,但我不知道为什么我不能运行(F5)代码?请给我一个线索,为什么代码不起作用?我使用python 2.7,谢谢先生
    • 是否有错误,如果,是什么?您提供的有关您的工作和环境的信息越多,就越容易为您提供帮助。
    【解决方案2】:

    使用 colspan 和 rowspan 解析表的最简单方法是使用 nodejs 与cheerio 和cheerio-tableparser 插件。

    var cheerio = require('cheerio'),
        cheerioTableparser = require('cheerio-tableparser'),
        fs = require('fs');
    
    var text = fs.readFileSync("colspan_rowspan.html", 'utf8');
    $ = cheerio.load(text);
    cheerioTableparser($);
    
    data = $("table").parsetable(true, true, true);
    console.log(data);
    
    //data = > 
    //[ [ 'NO', 'NO', '1', '2', '3', '4' ],
    //  [ 'NAMA', 'DEPAN', 'Ani', 'Dia', 'Rangga', 'Niko' ],
    //  [ 'NAMA', 'TENGAH', 'Tiara', 'Andari', 'Dimas', 'Reza' ],
    //  [ 'NAMA', 'BELAKANG', 'Ramadika', 'Putri', 'Putra', 'Anggara' ],
    //  [ 'TELEPON', 'KODE', '021', '022', '023', '024' ],
    //  [ 'TELEPON', 'NO TLP', '8466729', '5930290', '8349829', '4284982' ],
    //  [ 'KODE', 'KODE', '17412', '18291', '13901', '21211' ] ]
    

    结果将是列数组。所有由 colspan 和 rowspan 合并的单元格将在数组中具有相同的值。

    【讨论】:

    • OP 似乎要求提供 Python 解决方案。以上似乎不是Python解决方案。
    猜你喜欢
    • 2012-04-16
    • 2014-09-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多