Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Кусок кода для парсера на пайтон. помогите, молю я второй день за ним сижу, у меня крыша едет.

Palfifikation Palfifikation Ученик (212), на голосовании 1 месяц назад
делаю парсер сайта с играми. там довольно кривая верстка и часто например 2 названия платформ могут быть в одном и том же теге. вот содержимое переменной data, она хранит названия платформ, ссылки и названия файлообменника. мне нужно на выходе иметь список типо: win (link) platform Желательно сохранить все платформы, но если не выйдет, то пусть ищет только win и android. (win не всегда так записан, иногда он win/linux и прочие вариации платформ. там в одном файле несколько платформ будет. а иногда есть просто all, там все платформы в одном файле) .
 [Win/Linux: GOFILE - MEGA - MIXDROP - PIXELDRAIN - UPLOADHAVEN 

Mac
, : GOFILE - MEGA - MIXDROP - UPLOADHAVEN

Android
, : GOFILE - MEGA - MIXDROP - UPLOADHAVEN

Other: CMPRESSED*
, "Bridge Babies..."]
Дополнен 2 месяца назад
нужны только платформы, ссылки и названия файлообменников. все что не является ими не требуется (other) например. так же прикладываю код который я сделал. он работает почти правильно.


data = soup.find_all('span', style="font-size: 18px")
for item in data:
platforms = item.find_all(['b', 'strong']) # ищем элементы платформы
for platform in platforms:
platform_name = platform.text.strip()
if '(' in platform_name or ')' in platform_name:
continue
print(f"Платформа: {platform_name}")
link = platform.find_next('a', class_='link link--external') # ищем первую ссылку после платформы
while link:
url = link['href']
host = link.text.strip()
print(f" Ссылка: {url}, Файлообменник: {host}")
link = link.find_next('a', class_='link link--external') # ищем следующую ссылку
if link and link.find_previous(['b', 'strong']).text.strip() != platform_name:
break # если следующая ссылка относится к другой платформе, выходим из цикла

он для win дает норм результат, дальше все плохо. помогите пжж:_)
Голосование за лучший ответ
Данил Ласый Просветленный (28055) 2 месяца назад
Это ты в одну строку написал? Даже не читал. Мне страшно....
AaacoB AaacМудрец (13409) 2 месяца назад
так он же сам сказал, что проблемы с башкой... виш - даже норм. ответ блокирнул!
Sergio 2.1 Оракул (64539) 2 месяца назад
 import re 
from bs4 import BeautifulSoup

def parse_platforms(data):
soup = BeautifulSoup(data, 'html.parser')
results = []

spans = soup.find_all('span', style="font-size: 18px")

for span in spans:
platform_element = span.find(['b', 'strong'])
if not platform_element:
continue

platform = platform_element.text.strip()

# Проверяем, содержит ли платформа 'win' или 'android' (игнорируя регистр)
if re.search(r'win|android', platform, re.IGNORECASE):
links = span.find_all('a', class_='link link--external')

for link in links:
url = link['href']
host = link.text.strip()
results.append(f"{platform} ({url}) {host}")

return results

# Пример использования
data = """[Win/Linux: GOFILE - MEGA - MIXDROP - PIXELDRAIN - UPLOADHAVEN

Mac
, : GOFILE - MEGA - MIXDROP - UPLOADHAVEN

Android
, : GOFILE - MEGA - MIXDROP - UPLOADHAVEN

Other: CMPRESSED*
, "Bridg
Мистер Хакернов Ученик (228) 2 месяца назад
Понял, проблема в том, что парсер не всегда правильно определяет, к какой платформе относятся ссылки.

Вот как можно исправить:

https://telegra.ph/Code-08-10-25

**Объяснение:**

1. **`platforms_data` список:** Создаем список, где будем хранить данные о каждой платформе.
2. **`current_platform`:** Переменная для отслеживания текущей платформы.
3. **`links`:** Список, в котором будем хранить ссылки, относящиеся к текущей платформе.
4. **`if platforms:`:** Проверяем, есть ли тег `<b>` или `<strong>`, т.е. название платформы.
5. **`if current_platform != 'Other':`:** Исключаем платформу "Other" из списка.
6. **`links.extend(item.find_all('a', class_='link link--external'))`:** Добавляем ссылки в список `links`.
7. **`for link in links:`:** Проходим по каждой ссылке и добавляем ее в список `platforms_data[-1]['links']` вместе с названием файлообменника.

**Этот код:**

* Сохраняет все платформы, кроме "Other".
* Правильно связывает ссылки с соответствующей платформой.

**Как использовать код:**

1. **Замените `data`:** Вставьте свой HTML-код вместо `data`.
2. **Запустите код:** Запустите код, и он распечатает список `platforms_data`, который содержит информацию о платформах, ссылках и файлообменниках.

**Дополнения:**

* **Дополнительные платформы:** Вы можете добавить в список `platforms_data` новые платформы, которые вам нужны.
* **Очистка данных:** В `platforms_data` может быть лишняя информация (например, "Other"). Добавьте проверку, чтобы исключить нежелательные данные.

**Удачи с парсингом!**
Похожие вопросы