如何通过路径访问元素?

how to access elements by path?

我正在尝试用 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>]

我有兴趣检索:

我相信对于这些日子来说,重复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> 深以下)?或者我应该做不同的事情吗?

您也可以依赖 allumé 文本并得到 the next sibling div element:

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

或者,以类似的方式,依靠前面divclass

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