Как получить номер индекса конкретного тега и класса с помощью поиска текста? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть следующий html

<ul class="vote_list clearfix" id="vote_div">                    
    <li class="vote_one">
        <div class="vote_show">
            <div class="vote_T1">Chelsea</div>
            <div class="vote_state">
                <div class="vote_ST1">Votes:30000</div>
                <div class="vote_ST2">Ranking:1</div>
            </div>
        </div>
        <div class="vote_date">
            <div class="vote_T1">Chelsea</div>
        </div>
    </li>

    <li class="vote_one">
        <div class="vote_show">
            <div class="vote_T1">Arsenal</div>
            <div class="vote_state">
                <div class="vote_ST1">Votes:20000</div>
                <div class="vote_ST2">Ranking:2</div>
            </div>
        </div>
        <div class="vote_date">
            <div class="vote_T1">Arsenal</div>
        </div>
    </li>

    <li class="vote_one">
        <div class="vote_show">
            <div class="vote_T1">Liverpool</div>
            <div class="vote_state">
                <div class="vote_ST1">Votes:10000</div>
                <div class="vote_ST2">Ranking:3</div>
            </div>
        </div>
        <div class="vote_date">
            <div class="vote_T1">Liverpool</div>
        </div>
    </li>
<ul>

Я хочу получить общий голос "Челси", поэтому он должен показывать голоса: 30000

Моя идея: какой <li class="vote_one"> собственный Chelsea тексти он должен вернуть 0, поскольку Chelsea расположен на первом vote_one элементе

Но я не знаю, как преобразовать мою идею в код.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Печать votes и rank

Самый простой способ получить голоса для любого заданного ввода будет:

input_str = 'Chelsea'

for vote in soup.find_all('div', class_='vote_show'):
    if vote.find('div', class_='vote_T1').get_text().strip() == input_str:
        print(vote.find('div', class_='vote_ST1').get_text().strip()) # Prints votes
        print(vote.find('div', class_='vote_ST2').get_text().strip()) # Prints rank

Решение смотрит на все <div class='vote_show'>, чтобы проверить, совпадает ли текст в <div class='vote_T1'> со строкой ввода, например, Chelsea.

Я добавил strip(), чтобы вы могли найти совпадение дажеесли вокруг строки есть пробелы.Если совпадение найдено, текст содержащегося <div class='vote_ST1'> печатается, снова удаляя все окружающие пробелы.

Печать индекса

Вы можете изменить цикл for, чтобы использовать enumerate() следующим образом:

for idx, vote in enumerate(soup.find_all('div', class_='vote_show')):
    if vote.find('div', class_='vote_T1').get_text().strip() == input_str:
        print(idx) # prints index
        print(vote.find('div', class_='vote_ST1').get_text().strip()) # prints votes
        print(vote.find('div', class_='vote_ST2').get_text().strip()) # prints rank

Перечисление позволяет нам зацикливаться на чем-то и иметь автоматический счетчик.

Если вы хотите прекратить искать дальше, как только нашли совпадение, вы можетедобавить оператор break после оператора print().

0 голосов
/ 30 ноября 2018

Окончательно решено @ Idlehands

soup = BeautifulSoup(full_content, "lxml")

i=0
for vote_one_list in soup.find_all("li", class_="vote_one"):
        if vote_one_list.find("div", class_="vote_show").find("div", class_="vote_T1").text == "Chelsea":
                total_vote = soup.find_all("li", class_="vote_one")[i].find("div", class_="vote_show").find("div", class_="vote_state").find("div", class_="vote_ST1").text
                rank = soup.find_all("li", class_="vote_one")[i].find("div", class_="vote_show").find("div", class_="vote_state").find("div", class_="vote_ST2").text
                print "Chelsea | "+ rank + " | "+total_vote
        i = i+1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...