Как и при любом разборе HTML, вам необходимо сделать некоторые предположения относительно формата HTML.Если мы можем предположить, что предыдущая строка - это все до тега <br>
до тега уровня блока или другого <br>
, то мы можем сделать следующее ...
from BeautifulSoup import BeautifulSoup
doc = """
<li class="taf"><h3><a href="26eOfferCode%3DGSONESTP-----------" id="pa1">
Citibank <b>Credit Card</b> - Save over 5% on fuel | Citibank.co.in</a>
</h3>Get the IndianOil Citibank <b>Card</b>. Apply Now!
<br />
<a href="e%253DGOOGLE ------">Get 10X Rewards On Shopping</a> -
<a href="S%2526eOfferCode%253DGSCCSLEX ------">Save Over 5% On Fuel</a>
<br />
<cite>www.citibank.co.in/<b>CreditCards</b></cite>
</li>
"""
soup = BeautifulSoup(doc)
Теперь мы проанализировалиHTML, затем мы определяем список тегов, которые мы не хотим рассматривать как часть строки.На самом деле есть и другие теги блоков, но это относится и к этому HTML.
block_tags = ["div", "p", "h1", "h2", "h3", "h4", "h5", "h6", "br"]
Мы перебираем каждый тег <br>
, возвращаясь назад к его братьям и сестрам, пока у нас не останется больше или пока мы не достигнем тега уровня блока,Каждый раз, когда мы выполняем цикл, мы добавляем узел в начало нашей строки.NavigableStrings
не имеет атрибутов name
, но мы хотим включить их, следовательно, тест из двух частей в цикле while.
for node in soup.findAll("br"):
line = ""
sibling = node.previousSibling
while sibling is not None and (not hasattr(sibling, "name") or sibling.name not in block_tags):
line = unicode(sibling) + line
sibling = sibling.previousSibling
print line