我正在尝试用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>]
我有兴趣检索:
<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>
深?或者我应该采用不同的方式吗?
答案 0 :(得分:1)
您还可以依赖allumé
文字并获取the next sibling div
element:
y.find('div', text=u'allumé').find_next_sibling('div').text
或以类似方式依赖之前class
的{{1}}:
div
y.find('div', class_='ue-alarm-edit').find_next_siblings('div')[1].text
或者,只需通过索引获取y.find('div', text=re.compile(r'\d+:\d+')).text
:
div