2015-02-07 4 views
1

Я пытаюсь разобрать BeautifulSoup ужасную страницу HTML, чтобы получить несколько информации. Код ниже:Как получить доступ к элементам по пути?

import bs4 

with open("smartradio.html") as f: 
    html = f.read() 

soup = bs4.BeautifulSoup(html) 
x = soup.find_all("div", class_="ue-alarm-status", playerid="43733") 
print(x) 

извлекает фрагменты я хотел бы проанализировать далее:

[<div alarmid="f319e1fb" class="ue-alarm-status" playerid="43733"> 
<div> 
<div class="ue-alarm-edit ue-link">Réveil 1:   </div> 
<div>allumé</div> 
<div>7:00</div> 
</div> 
<div> 
<div class="ue-alarm-dow">Lu, Ma, Me, Je, Ve   </div> 
<div class="ue-alarm-delete ue-link">Supprimer</div> 
</div> 
</div>, <div alarmid="ea510709" class="ue-alarm-status" playerid="43733"> 
<div> 
<div class="ue-alarm-edit ue-link">Réveil 2:   </div> 
<div>allumé</div> 
<div>7:30</div> 
</div> 
<div> 
<div class="ue-alarm-dow">Sa   </div> 
<div class="ue-alarm-delete ue-link">Supprimer</div> 
</div> 
</div>] 

Я заинтересован в получении:

  • час (строка 5 и 14)
  • строка (дни по-французски) под <div class="ue-alarm-dow">

Я считаю, что на днях достаточно повторить find() или find_all(). Я упоминаю, что, поскольку в то время как она захватывает нужную информацию, я не уверен, что это правильный путь, чтобы разобрать файл с BeautifulSoup (но, по крайней мере, он работает):

for y in x: 
    z = y.find("div", class_="ue-alarm-dow") 
    print(z.text) 
# output: 
# Lu, Ma, Me, Je, Ve    
# Sa  

Я не знаю, как получить до часа. Есть ли способ навигации по дереву по пути (в том смысле, что я знаю, что час находится под вторым <div>, три <div> глубоко)? Или я должен делать это по-другому?

ответ

1

Вы также можете рассчитывать на allumé текст и получить the next sibling div element:

y.find('div', text=u'allumé').find_next_sibling('div').text 

или, подобным образом, опираясь на class предыдущего div:

y.find('div', class_='ue-alarm-edit').find_next_siblings('div')[1].text 

или, используя regular expressions :

y.find('div', text=re.compile(r'\d+:\d+')).text 

или, просто получите div по индексу:

y.find_all('div')[4].text 
Смежные вопросы