我试图使用beautifulSoup从网站中提取数据。我想从此HTML代码段中提取数据
<ul class="result-info info-bro-6 cc" style="display: block;">
<li>
<strong>MODERATED</strong>
<ul class="cc">
<li>
Health </li>
<li>
C**** </li>
<li>
C******* </li>
<li>
D**** </li>
<li>
Di8**** </li>
<li>
Di**** </li>
<li>
F******* </li>
<li>
Fi****** </li>
<li>
L****** </li>
<li>
M**** </li>
<li>
NM***** </li>
<li>
P****** </li>
<li>
Pr***** </li>
<li>
Sp**** </li>
<li>
*******e </li>
</ul>
</li>
<li>
<strong>
*********
</strong>
<ul class="cc">
<li>*** /****</li>
</ul>
</li>
</ul>
我要提取的数据是“ *** / ****”。我希望我的代码仅返回此内容,但是我目前拥有的代码将返回li标记内的所有数据。我怎样才能只提取我想要的数据?
这是我当前的代码:
from bs4 import BeautifulSoup
import requests
html = """<ul class="result-info info-bro-6 cc" style="display: block;">
<li>
<strong>H*******</strong>
<ul class="cc">
<li>
H***** </li>
<li>
C**** </li>
<li>
C******* </li>
<li>
D**** </li>
<li>
Di***** </li>
<li>
Di**** </li>
<li>
F******* </li>
<li>
Fi****** </li>
<li>
L****** </li>
<li>
M**** </li>
<li>
NM***** </li>
<li>
P****** </li>
<li>
Pr***** </li>
<li>
Sp**** </li>
<li>
*******e </li>
</ul>
</li>
<li>
<strong>
*********
</strong>
<ul class="cc">
<li>*** /****</li>
</ul>
</li>
</ul>"""
soup = BeautifulSoup(html)
for ultag in soup.find_all('ul', {'class': 'cc'}):
for litag in ultag.find_all('li'):
print(litag.text)
答案 0 :(得分:0)
您已经注意到,有一堆ul
带有class=cc
的标签。您需要在HTML中找到一个一致性,使您可以同时抓取一个和一个。
例如,您想要的ul
标记是HTML中的最后一个标记。因此,无需遍历所有ul
标签,只需获取最后一个标签即可:
ultag = soup.find_all('ul', {'class':'cc'})[-1]
litag = ultag.li
print(litag.text)
不幸的是,如果由于稍后HTML代码中包含更多ul
标签而导致此操作不起作用,那么您将需要使导航更加具体。
如果它是类ul
中的最后一个result-info info-bro-6 cc
,那么这可能会有所帮助:
outer_ul = soup.select_one('ul.result-info.info-bro-6.cc')
last_ul = outer_ul.find_all('ul')[-1]
print(last_ul.text)
答案 1 :(得分:0)
您可以使用next
查找该标签的下一个兄弟
soup = BeautifulSoup(html, 'html.parser')
data = soup.findAll('ul', attrs={'class':'cc'})[2].next.next.text
print(data)