Извлечение данных из html с помощью BeautifulSoup в Python

#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. извините, я забыл добавить