如何通过路径访问元素?
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>]
我有兴趣检索:
- 小时(第 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>
深以下)?或者我应该做不同的事情吗?
您也可以依赖 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
我正在尝试用 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>
深以下)?或者我应该做不同的事情吗?
您也可以依赖 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