使用BeautifulSoup解析由<br>标签分隔的行?

10 投票
5 回答
8329 浏览
提问于 2025-04-15 19:32

我有一个页面,看起来像这样:

Company A<br />
123 Main St.<br />
Suite 101<br />
Someplace, NY 1234<br />
<br />
<br />
<br />
Company B<br />
456 Main St.<br />
Someplace, NY 1234<br />
<br />
<br />
<br />

有时候,分隔这些条目的“br”标签会有两个,而不是三个。我想用BeautifulSoup来解析这个文档,提取出我需要的内容,但我不知道该怎么做,因为我需要的文本并不在段落(或类似的)标签里,我不能简单地一个个遍历。

5 个回答

0

也许你可以使用这个函数:

def partition_by(pred, iterable):
    current = None
    current_flag = None
    chunk = []
    for item in iterable:
        if current is None:
            current = item
            current_flag = pred(current)
            chunk = [current]
        elif pred(item) == current_flag:
            chunk.append(item)
        else:
            yield chunk
            current = item
            current_flag = not current_flag
            chunk = [current]
    if len(chunk) > 0:
        yield chunk

再加一个检查,看看是不是一个 <br /> 标签或者换行符:

def is_br(bs):
    try:
        return bs.name == u'br'
    except AttributeError:
        return False

def is_br_or_nl(bs):
    return is_br(bs) or u'\n' == bs

(或者其他更合适的东西……我对BeautifulSoup不是很在行。)

然后使用 partition_by(is_br_or_nl, cs) 来处理(这里的 cs 设置为 BeautifulSoup.BeautifulSoup(your_example_html).childGenerator()

[[u'Company A'],
 [<br />],
 [u'\n123 Main St.'],
 [<br />],
 [u'\nSuite 101'],
 [<br />],
 [u'\nSomeplace, NY 1234'],
 [<br />, u'\n', <br />, u'\n', <br />, u'\n', <br />],
 [u'\nCompany B'],
 [<br />],
 [u'\n456 Main St.'],
 [<br />],
 [u'\nSomeplace, NY 1234'],
 [<br />, u'\n', <br />, u'\n', <br />, u'\n', <br />]]

这样处理起来应该挺简单的。

如果想要更通用一点,你可能需要写一个条件函数,来检查它的参数是不是你关心的东西……然后你可以用它和 partition_by 一起使用,把其他的东西归为一类。注意,你关心的东西也会被归为一类——你基本上需要处理生成器产生的每个第二个列表中的每一项,从第一个开始,这个第一个列表里包含你关心的东西。

6

你应该看看标签里面的 .strings 属性,然后用 "\n".join() 来处理它。

2

一旦你有了这个HTML片段,只需要用一个正则表达式把 <br /> 后面可能跟着的换行符替换成一个单独的换行符,然后再根据多个换行符进行分割。这样就会得到多个独立的段落,你可以手动处理这些段落。

撰写回答