如何从BeautifulSoup中的多个嵌套标签获取原始文本?

时间:2017-04-05 13:12:11

标签: python arrays web-scraping beautifulsoup

import re
import time
from datetime import datetime
import platform
import pandas as pd
from numpy import nan
from itertools import chain
sdCel = 'http://www.linguista.ch/sprachschule/san-diego-cel/'

browser = webdriver.Chrome() # run it with chrome browser appearing
browser.get(sdCel)

soup = BeautifulSoup(browser.page_source, "html.parser")

sellingPoints = soup.find('div', {'class':'column column_620   column_content'})
points_ul = sellingPoints.find_next_siblings()
list = []

for item in points_ul:
    print item.findAll('li') # .get('li') does not work: AttributeError: 'ResultSet' object has no attribute 'get'
    list.append(item)

for newItem in list:
    print newItem.findAll('li') 

这是结果

[<li class="calculate"><a class="f16" href="nc/kostenlose-  beratung/sprachschule/San%2520Diego%2520Sprachschule%2520College%2520of%2  520English%2520Language/" title="College of English Language: kostenlose      Beratung"><img alt="" border="0" src="fileadmin/img/icon_consultation.png"/> Kostenlose Beratung</a></li>, <li class="calculate"><a class="f16" href="nc/sprachaufenthalt-preis-berechnen/sprachschule/san-diego-cel/" title="College of English Language: jetzt online buchen"><img alt="" border="0" src="fileadmin/img/icon_booking.png"/> Jetzt buchen</a></li>]
[]
[<li>Beste Lage im Stadtzentrum von San Diego</li>, <li>Sprachschule  mit famil\xe4rer Atmosph\xe4re</li>, <li>Von der Terrasse aus geniessen Sie einen tollen Blick \xfcber die Stadt</li>, <li>Kleine Klasen mit max. 10 Teilnehmern</li>, <li>Hervorragendes Preis- / Leistungsverh\xe4ltnis</li>]
[]
[]
[]
[]
[<li>Schlendern durchs Gaslamp Quarter der Old Town </li>, <li>Besuch des weltber\xfchmten San Diego Zoos </li>, <li>Relaxen und grillen am Strand  </li>, <li>Ausflug Disneyland oder zu den Universal Studios </li>, <li>Rollerbladen entlang der Strandpromenade </li>]
[]
[]

我尝试通过创建名为list的新列表并从那里获取li标记来解决此嵌套列表。我也尝试调用.get(),但这也不起作用。

如何在忽略空对象的同时获取原始文本的文本某些特定li标签?

1 个答案:

答案 0 :(得分:2)

您可以使用lambdas来搜索包含子项或文字的li,以避免获得空结果。

以下是一个例子:

example = """<li></li><li class="calculate"><a class="f16" href="nc/kostenlose-beratung/sprachschule/San%2520Diego%2520Sprachschule%2520College%2520of%2520English%2520Language/" title="College of English Language: kostenloseBeratung"><img alt="" border="0" src="fileadmin/img/icon_consultation.png"/>Kostenlose Beratung</a></li>, <li class="calculate"><a class="f16"href="nc/sprachaufenthalt-preis-berechnen/sprachschule/san-diego-cel/"title="College of English Language: jetzt online buchen"><img alt=""border="0" src="fileadmin/img/icon_booking.png"/> Jetzt buchen</a></li>"""

soup = BeautifulSoup(example, 'lxml')

for li in soup.find_all(lambda tag: tag.name == "li" and (len(tag.findChildren()) > 0 or len(tag.text) > 0)):
    print (li.get_text(strip=True))

将打印:

  

Kostenlose Beratung

     

Jetzt buchen