Как очистить данные из нескольких элементов одного класса?

Я пытаюсь получить некоторые данные с сайта киберспортивной статистики (vlr.gg). Я решил использовать BeatifulSoup, но сейчас столкнулся с некоторыми проблемами при очистке данных из одних и тех же имен классов.

box5=soup.find_all("div",class_ = "match-header-vs-score")
for p in box5:
    matchtdetails=p.find("div",class_ = "match-header-vs-note").get_text(strip=True)
    print("          In: ",matchtdetails) 
    
    
box6=soup.find_all("div",class_ = "match-header-vs-note")
for q in box6:
    if q.find("div",class_ = "match-header-vs-note"):
     matchdetails1=q.find("div",class_ = "match-header-vs-note").get_text(strip=True)
     print(matchdetails1)

Это конкретный блок HTML-кода, с которым я работаю:

<div class = "match-header-vs-score">
<div class = "match-header-vs-note">
<span class = "match-header-vs-note mod-upcoming">18h 24m 
</span>
</div>
<div class = "match-header-vs-placeholder"> –
</div>
<div class = "match-header-vs-note">Bo3
</div>
</div>  

Я новичок в очистке HTML, и, насколько я понял, для получения конкретных данных я должен указать «поле» на класс, немедленно обертывая классы нужных мне данных, а затем перебирать классы в цикле и « Найдите» конкретный класс, из которого мне нужны данные. Box5 используется для получения статистики оставшегося времени, box6 — для ее формата (bo1, bo3 и т. д.).

Однако в этом коде box6 мне ничего не возвращает.

Что касается box5, я изначально пытался использовать find_all() для «match-header-vs-note», так как это был непосредственный класс, который обертывал «предстоящий мод match-header-vs-note», но он продолжал выдавать мне NoneType Attribute Error. Я думал, что проблема заключается в пробеле, обозначающем несколько классов внутри, но нет, аналогичные классы с пробелами в имени работали и в других местах. После того, как я изменил код для box5 на код, который я дал выше, он работает.

Первоначально мой мыслительный процесс заключался в использовании find_all() внутри цикла и сохранении данных в списке, но, как я узнал, это выдает следующую ошибку:

AttributeError: 'NavigableString' object has no attribute 'find_all'. Did you mean: '_find_all'?    
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы близки к решению и уже сделали правильный выбор, но другого <div> с соответствующим классом внутри box6 вы не найдете, потому что вы уже позиционировали себя на этом элементе.

Постарайтесь упростить свой подход и использовать информацию ResultSet как есть:

box5,box6 = [e.get_text(strip=True) for e in soup.find_all("div",class_ = "match-header-vs-note")]

Или выберите родительский элемент и поработайте над его текстовым содержимым:

box5,box6 = soup.find("div",class_ = "match-header-vs-score").get_text(strip=True).split('–')
Пример
import requests
from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get('https://www.vlr.gg/326896/leviat-n-gc-vs-firepower-game-changers-2024-latam-south-opening-w5').text)

box5,box6 = [e.get_text(strip=True) for e in soup.find_all("div",class_ = "match-header-vs-note")]

Я не знал, что он так себя ведет, большое спасибо. Итак, box6 просто перешел к следующему экземпляру, имя класса было найдено, а box5 остается в первом экземпляре, если я правильно понимаю. Однако что, если я хочу избежать перехвата первого экземпляра (т. е. box5) и сразу перейти ко второму экземпляру, используя только один ящик?

Priyanshu Lahiri 16.05.2024 09:04

Это было бы предназначено для задания нового вопроса именно с этим фокусом, чтобы сохранить ОП в чистоте. Однако в случае избежания box5 просто разрежьте свой ResultSet и выберите последний элемент. soup.find_all("div",class_ = "match-header-vs-note")[-1].

HedgeHog 16.05.2024 09:15

Другие вопросы по теме