也許你可以使用此功能:
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
來將其他所有東西都集中在一起。請注意,您關心的事物也會混在一起 - 您基本上必須處理由生成器生成的每個第二個列表中的每個項目,從第一個包含您關心的事項開始。
感謝您的回答,但不幸的是它只是使用正則表達式不是那麼簡單。我簡化了上述文檔以更好地說明我的問題。實際的文檔有一堆混亂的HTML格式標籤等等。 – jamieb 2010-02-21 07:46:06
但是您不關心文檔,只是由'
'標籤分隔的部分。使用BeatifulSoup首先提取該部分。 – 2010-02-21 07:50:07
我不確定爲什麼有人低估了你的答案;我很感激幫助。我會根據你的建議嘗試一些想法。我只是希望BeautifulSoup能夠消除手動解析的需要。謝謝。 – jamieb 2010-02-21 07:58:23