使用beautiful将<tr>组按unique<td>分隔

2024-04-20 11:05:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

...
<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>分隔,上面刻着<td colspan=3>,这让我很难抓取信息。。。虽然我尝试了this方法,但由于所有组共享公共的<tr>标记,所以我无法获得数据。你知道吗

有没有合理的方法用beautifulsoup来划分这些部分?提前谢谢。你知道吗


Tags: divsrcimgfoomainbaraltgif
1条回答
网友
1楼 · 发布于 2024-04-20 11:05:35

实际上,我最近不得不处理很多这样的数据结构-td其中一些span是一个头,下一个td是内容,直到新的带有spantd出现

我用这种东西。你知道吗

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())]

相关问题 更多 >