Извлечение данных из HTML с помощью BeautifulSoup в Python - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь извлечь данные с веб-сайта с помощью 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)

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

вы можете использовать next, чтобы найти следующего брата этого тега

soup = BeautifulSoup(html, 'html.parser')
data = soup.findAll('ul', attrs={'class':'cc'})[2].next.next.text
print(data)
0 голосов
/ 13 марта 2019

Как вы заметили, есть куча 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...