#python #html #beautifulsoup
#python #HTML #beautifulsoup
Вопрос:
Я пытаюсь извлечь данные с веб-сайта с помощью 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)
Ответ №1:
Как вы заметили, существует множество 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. Я должен был быть более конкретным в своем вопросе, позже во всем HTML будет намного больше тегов ul, мне также нужно извлечь данные из них, есть ли какой-либо способ указать длину данных для возврата с помощью beautiful soup?
2. @PythonNewbie Попробуй выяснить, как получить это только
ul
последним — например, всегда ли это последнееul
вul class="result-info info-bro-6 cc"
?3. Это всегда последний UL в каждом классе ul=»result-info info-bro-6 cc». Я относительно новичок как в Python, так и в stack overflow, поэтому, пожалуйста, спросите, нужны ли вам разъяснения
Ответ №2:
вы можете использовать next
для поиска следующего родственного тега
soup = BeautifulSoup(html, 'html.parser')
data = soup.findAll('ul', attrs={'class':'cc'})[2].next.next.text
print(data)
Комментарии:
1. Вероятно, следует рассмотреть возможность добавления некоторого описания к ответу. Хотя ответы только для кода не противоречат правилам, ответ может быть не таким понятным для OP, как для вас, поэтому всегда приветствуется некоторое объяснение
2. извините, я забыл добавить