Это мое время сиять!
Информация:
В настоящее время я работаю над агрегатором финансовых данных, который столкнулся с точно такой же проблемой.
Он собираетданные примерно с дюжины веб-сайтов и организуют их в объект JSON, который затем используется сайтом Flask для отображения данных.
Эти данные извлекаются с веб-сайтов, имеющих несколько подкаталогов с похожим содержимым, которые имеют разныйселекторы.
Как вы можете себе представить, с фреймворком, подобным selenium
, это становится очень сложным, поэтому единственное решение состоит в том, чтобы его опустить.
Решение:
Простота - это ключ , поэтому я удалил все зависимости, кроме библиотеки BeautifulSoup
и requests
.
Затем я создал три класса и функцию для каждого filter
[1]
from bs4 import BeautifulSoup
class GET:
def text(soup, selector, index = 0):
selected = soup.select(selector)
if len(selected) > index:
return selected[index].text.strip()
class Parse:
def common(soup, selector):
return GET.text(soup, selector, index = 5)
class Routes:
def main(self):
data = {}
if self.is_dir_1:
data["name"] = GET.text(self.soup, "div")
data["title-data"] = Parse.common(self.soup, "p > div:nth-child(1)")
elif self.is_dir_2:
data["name"] = GET.text(self.soup, "p", index = 2)
data["title-data"] = Parse.common(self.soup, "p > div:nth-child(5)")
return data
def filter_name(url: str, response: str, filter_type: str):
if hasattr(Routes, filter_type):
return getattr(Routes, filter_type)(to_object({
"is_dir_1": bool("/sub_dir_1/" in url),
"is_dir_2": bool("/sub_dir_1/" in url),
"soup": BeautifulSoup(html, "lxml")
}))
return {}
Используя библиотеку requests
, я сделал запрос на получение данных, затем передал URL, текст ответа и тип_фильтра в функцию filter_name
.
Затем в функции filter_name
n Я использовал аргумент filter_type
, чтобы передать «суп» в целевую функцию маршрута и выбрать каждый элемент и получить там его данные.
Затем в функции целевого маршрута я использовалусловие if
для определения подкаталога и присвоения текста объекту данных.
После того, как все это завершено, я возвратил объект data
.
Этот метод очень прост исохранил мой код СУХОЙ, он даже позволяет использовать необязательные пары key: value
.
Вот код для вспомогательного класса to_object
:
class to_object(object):
def __init__(self, dictionary):
self.__dict__ = dictionary
Это преобразует словари в объекты, поэтому вместо этогонеобходимости всегда писать:
self["soup"]
Вы бы написали:
self.soup
Исправление ошибок:
Вам действительно нужно стандартизировать тип отступа, который вы используете, потому что вашСценарий вызывает следующую ошибку:
Traceback (most recent call last):
File "", line 84
Amount = [13.000, 14.000, 15.000, 30.000, 45.000, 60.000]
^
IndentationError: unindent does not match any outer indentation level
Примечания: * Фильтры
- - это сценарии, которые очищают разные сайты, мой проект требует, чтобы я очистил несколько сайтов, чтобы получить необходимые данные.
- попробуй привести тебя в порядокБолее того, аккуратный код легче читать и проще писать
Надеюсь, это поможет, удачи.