如何通过路径访问元素?
问题描述:
我想用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>
,3个<div>
深处)?或者我应该以不同的方式做?
答
您也可以依靠allumé
文本,并得到the next sibling div
element:
y.find('div', text=u'allumé').find_next_sibling('div').text
,或者以类似的方式,依靠以前div
的class
:
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