如何通过路径访问元素?

时间:2015-02-07 15:06:04

标签: python html beautifulsoup html-parsing

我正在尝试用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 个答案:

答案 0 :(得分:1)

您还可以依赖allumé文字并获取the next sibling div element

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

或以类似方式依赖之前class的{​​{1}}:

div

或使用regular expressions

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

或者,只需通过索引获取y.find('div', text=re.compile(r'\d+:\d+')).text

div
相关问题