Для курсового проекта по базе данных моего университета мы можем придумать собственную идею для базы данных, которую мы хотели бы реализовать (и тогда мы это делаем). Когда дело дошло до получения данных для заполнения этих таблиц, мне сказали, что некоторые студенты прошлых лет писали строки вставки вручную, и некоторые другие однокурсники планировали сделать то же самое.

Так как я пишу код для генерации вставок в БД (и вообще все остальное (но я не буду это освещать)), я показал другу, который сразу мне это сказал, 6-строчный скрипт на питоне, который генерировал Более 4000 строк команд вставки SQL для заполнения таблицы с названием «Музыкальные жанры» уникальными музыкальными жанрами.

Я объясню следующие 6 строк кода и расскажу, как можно сделать что-то очень похожее, чтобы упростить заполнение таблиц базы данных. (И я включу второй пример с элементами Minecraft вместо музыкальных жанров после объяснения). В конце концов, вы должны понять идею этих строк таким образом, чтобы вы могли применить их к своей ситуации.

Приведенный выше скрипт выводит эти SQL-команды на консоль (их слишком много, чтобы отобразить здесь)

Что происходит?

Первые две строки:

Сначала нам нужно получить данные откуда-то. Мы получаем все музыкальные жанры с http://everynoise.com/everynoise1d.cgi?scope=all

import requests — импорт библиотеки Python, которая позволит нам запросить эту веб-страницу.

everynoisetext = requests.get(the above URL).text — сохранение свойства текстового ответа из запроса к сайту.

Запрос

Если вы 1) переходите на веб-сайт, 2) открываете окно проверки браузера, 3) выбираете вкладку «Сеть» в инспекторе, 4) обновляете страницу и 5) щелкаете первый элемент, который появляется в списке сетей, вы должны увидеть что-то вроде этого:

И затем, нажав «Ответить», вы должны увидеть:

Когда мы делаем запрос на получение(request.get) по указанному выше URL-адресу, мы получаем в ответ HTML-код страница.

Поскольку на странице отображается список жанров, мы, вероятно, сможем найти эти жанры в HTML. Нам просто нужен способ их поиска.

У нас есть этот HTML-код в виде строки, мы сохранили его как переменную everynoisetext. (response.get(URL).текст вернул содержимое ответа. (если напечатать: '<html>\n<head>\n<meta charset="utf-8">\n<title>Every Noise at Once</ti...)).

Мы найдем то, что нам нужно, с помощью следующих двух строк.

Следующие две строки:

import re — импорт библиотеки python, которая позволит нам искать огромную строку (код HTML, сохраненный в everynoisetext) — re означает регулярные выражения . (Регулярное выражение — это последовательность символов, определяющая шаблон поиска, мы изучаем это в теории вычислений, поэтому я просто объясню синтаксис Python, который нам понадобится заранее.)

allgenres = re.findall(REGULAR EXPRESSION, everynoisetext) — поиск всех музыкальных жанров внутри everynoisetext с помощью регулярного выражения. findall возвращает список, и мы сохраняем его как allgenres.

Регулярное выражение

Начните с просмотра HTML-кода и подумайте, какой шаблон встречается только рядом со словом.

Глядя на наш HTML, я обнаружил, что каждый музыкальный жанр находится в отдельной строке.

Если вы прокрутите приведенный выше образец вправо, вы также заметите, что прямо перед каждым названием жанра мы видим style=”color: #some-color-number"> ; и сразу после у нас есть < .

Мы хотим найти в этом тексте именно style="color: #acolorcode">anynumberofletters< . Таким образом, наше регулярное выражение будет именно таким — нам просто нужно изменить «цветовой код» и «любое количество букв» на синтаксис, который будут понимать регулярные выражения Python.

В отношении Python:

. означает любой символ

* означает любое количество раз

? после * немного сложнее понять. В документации по Python это описано так: Квалификаторы '*', '+' и '?' являются жадными; они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE <.*> сопоставляется с '<a> b <c>', оно будет соответствовать всей строке, а не только '<a>'. Добавление ? после квалификатора заставляет его выполнять сопоставление нежадным или минимальным образом; будет найдено как можно меньше символов. Использование RE <.*?> будет соответствовать только '<a>'.

Таким образом, заменив выражение правильным синтаксисом, мы получим:

style="color: #.*?">.*?< — осталось доделать только одно.

Если мы будем искать этот шаблон в строке, мы получим не только музыкальные жанры, но и предыдущий style="color …

Мы хотим захватить только .*? между > и <.

К счастью, в python re есть функция, называемая группами. Мы можем создать группу для части выражения с помощью ().

А функция findall будет добавлять к возвращаемому списку только то, что находится внутри группы.

Таким образом, наше окончательное выражение будет style="color: #.*?">(.*?)<.

И после использования внутри re.findall, allgenres будет хранить [‘pop’, ‘danc…]

Последние две строки

for genre in allgenres: — перебирать все жанры в списке

print('insert into MusicGenres values("{}")'.format(genre)) — выводит эту команду SQL на консоль и заменяет {} в строке жанром с помощью функции format Python.

Чтобы сделать это для своего собственного проекта, вы можете начать с поиска веб-страницы с данными, которые вы ищете, проверить ответ на запрос, создать регулярное выражение для поиска ваших данных в тексте ответа, а затем распечатать его.

Второй пример: Предметы Minecraft

Это будет менее глубокий пример — вы должны понять идею с первого раза. Этот генерирует последовательный table_id i и фиксирует две группы в регулярном выражении, как (см. Следующее изображение), так и название элемента и текст minecraft:type.

Сайт имеет пункты:

Код:

Для вывода этого просто запустите интерпретатор Python (введите python в консоли) и скопируйте, а затем вставьте этот код.

Дополнительный

Чтобы сохранить вывод в виде файла, просто перенаправьте стандартный вывод в файл в терминале:

python script.py > output.txt

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

Надеюсь, это помогло, ~romes

PS: если что-то не так, дайте мне знать, и я это исправлю