0

所以我试图抓取的网页是这样的:

...
<tr><td colspan=3><BR><div class="list">Foo:</div></td></tr>
<tr><td><img src="/images/2.gif" alt="Main"> <a href="/foo/1/"></A></td><td><a href="/browse/foo/1/">foo1</A></td></tr>
<tr><td><img src="/images/2.gif" alt="Main"> <a href="/foo/2/"></A></td><td><a href="/browse/foo/2/">foo2</A></td></tr>
<tr><td><img src="/images/1.gif" alt="Guest"> <a href="/foo/3/"></A></td><td><a href="/browse/foo/3/">foo3</A></td></tr>

<tr><td colspan=3><BR><div class="list">Bar:</div></td></tr>
<tr><td><img src="/images/1.gif" alt="Guest"> <a href="/bar/1/"></A></td><td><a href="/browse/bar/1/">bar1</A></td></tr>
<tr><td><img src="/images/1.gif" alt="Guest"> <a href="/bar/2/"></A></td><td><a href="/browse/bar/2/">bar2</A></td></tr>
<tr><td><img src="/images/2.gif" alt="Main"> <a href="/bar/3/"></A></td><td><a href="/browse/bar/3/">bar3</A></td></tr>

<tr><td colspan=3>...

我想抓取数据如下:

...
Foo:
    foo1
    foo2
    foo3

Bar:
    bar1
    bar2
    bar3
...

每个内容都<tr>用inscribed分隔,<td colspan=3>这使我很难抓取信息......虽然我已经尝试过这种<tr>方法,但由于所有组共享共同的标签,我无法获取数据。

是否有合理的方法使用beautifulsoup 划分这些部分?提前致谢。

4

1 回答 1

0

实际上我最近不得不处理很多这样的数据结构——td其中一些span是标题,而下一个td是内容,直到新tdspan出现

我用这样的东西。

class TrGrouper:
    def __init__(self, attr='colspan'):
        self.value = 0 
        self.attr = attr

    def __call__(self, tr):
        first_cell = tr.th if tr.th else tr.td
        self.value += int(first_cell.get(self.attr))
        return self.value


#usage:

import itertools

list_of_TRs = soup.find_all('tr')

for _, chunk in itertools.groupby(list_of_TRs, TrGrouper()):
    # do_something 
    # note that chunk is a generator

#or

grouped_rows = [list(chunk) for _, chunk in itertools.groupby(list_of_TRs, TrGrouper())]
于 2013-04-15T18:09:11.037 回答