Вот рабочее решение, использующее BeautifulSoup и некоторое неприятное регулярное выражение, но оно работает нормально. Я люблю регулярные выражения, но, кажется, я делаю их странным образом, я могу объяснить вам, как они работают, если хотите.
import re, urllib.request
from bs4 import BeautifulSoup
url = "https://www.imdb.com/search/title?groups=top_250&sort=user_rating"
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
i = 0
for txt in soup.findAll(attrs={"class" :"lister-item-header"}):
i += 1
print(str(i) + " ." + re.match("""^.*>(.*)</a>.*$""", re.sub('"', '', re.sub('\n', '', str(txt)))).group(1))
Мой вывод: (это французский ...)
Les évadés
Le parrain
Темный рыцарь: Le chevalier noir
Le parrain, 2ème partie
Le seigneur des anneaux: Le retour du roi
И этот список можно продолжить ...
Попробуйте свои силы на open source InstantObjects , и вы всегда захотите использовать это для всех видов программирования баз данных в Delphi.
В IO вам нужно будет определить всю структуру данных в его интерфейсе, а затем он сгенерирует необходимый код для вас.
Просто попробуйте.
Что касается генерации идентификаторов, то доверие MySQL для генерации идентификатора автоинкремента для тебя. Не тратьте время на его кодирование.
Поскольку вы используете Delphi, обязательно посмотрите DataModules. Здесь вы размещаете компоненты и логику доступа к базе данных.
Поместите классы в простые "Unit" файлы.
Заставьте UI взаимодействовать с этими двумя, чтобы все происходило. Вы можете использовать компоненты доступа к базе данных непосредственно в форме, но лучше всего это сделать в режиме «только отображение» и с использованием модуля данных для выполнения операций с данными. (Вы можете делать все, что указано в форме для базовых приложений, но если вы хотите разбить приложение на модули, целесообразно держать его отдельно).
Один из простых способов обеспечить такое разделение - написать модульные тесты для вашей бизнес-логики. Помимо других (существенных) преимуществ, возможность тестирования кода означает, что он не может (намеренно или иначе) быть тесно связан с пользовательским интерфейсом.
Я пытаюсь (но не всегда удается) сохранить детали уровня данных отдельно с помощью ClientDataSets, независимо от того, что используется в серверной части (обычно DBExpress или DBISAM). Я также стараюсь написать хотя бы несколько интеграционных тестов, чтобы убедиться, что уровень данных работает так, как ожидалось (отдельная тестовая база данных с известными значениями).
С бизнес-логикой и данными (даже частично) пользовательский интерфейс становится гораздо более простым. вперед. И ремонтопригодный.
Метод, который я использую и работающий очень хорошо, - это попытаться взять на себя различные роли из вашего приложения, а затем программировать, как если бы вы были в этой роли. Например, когда вы работаете с серверной частью базы данных, даже не думайте о графическом интерфейсе. Вместо этого подумайте о раскрытии классов и методов, которые просто работают с данными. Если вы создадите собственный SDK, который позже будете использовать, вы обнаружите, что его обслуживание будет намного проще.
Разработка на основе тестов - ваш друг. Познакомьтесь с DUnit и создайте небольшие краткие тесты для проверки любого нетривиального кода. Задокументируйте интерфейсы и все, что не видно на экране, полном кода.
Лично я использую tiopf для бизнес-модели. Tiopf предоставляет уровень доступа к данным. Последний код из репозитория включает платформу model-gui-mediator, аналогичную MVC для отображения модели. Это позволяет отображать данные с помощью стандартных компонентов delphi.
Tiopf также включает ряд генераторов идентификаторов (guids, 32-битные и 64-битные целые числа и т. Д.).
Если вас интересует tiopf, я предлагаю вам начать с просмотра моего обзора . Затем направляйте любые вопросы в группы новостей.
Я бы посмотрел на Model-View-Controller (который является расширением Observer / Observable Pattern). Это означает, что «представление» (т.е. пользовательский интерфейс) знает только, как обновлять данные, а затем реагировать на обновляемые данные. Модель (или Observable) знает, как манипулировать данными и сообщать представлениям, что они были обновлены. Это означает, что вы можете заменить пользовательский интерфейс, не меняя поставщика данных, и наоборот.
Выполните поиск в Google, поскольку есть множество примеров этого для Delphi (но не так много для Java / C #, и т. д.)