使用BeautifulSoup解析由<br>标签分隔的行?
我有一个页面,看起来像这样:
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 />
后面可能跟着的换行符替换成一个单独的换行符,然后再根据多个换行符进行分割。这样就会得到多个独立的段落,你可以手动处理这些段落。