Веб-скрейпинг Python — захват содержимого <strong> и изображений

В этом семестре я дал себе побочный проект, содержание которого мы вообще не освещаем. Я пытаюсь взять контент с сайта (url в коде), который я могу поместить в текстовый или SQL-файл для использования (предпочтительно текст на данный момент). Примерно через час я понял, как получить элемент <strong> и вывести его на консоль, но попытка сохранить его в файл оставляет его пустым. Попытка print.(x).text и добавление .text к моему find_all привели к ошибкам.

Так что это оставляет меня с некоторыми другими вопросами. Если я пытаюсь получить классы, это должен быть тот же процесс, который я использую сейчас, просто заменяя правильное имя класса? На страницах также есть изображения, они не нужны, но я хотел бы их использовать, если это возможно. У них разные имена классов, на сайте есть все в виде списка, а не в таблице, поэтому смогу ли я получить второе изображение без необходимости получать другие?

import requests

url = "https://www.db.yugioh-card.com/yugiohdb/card_search.action?ope=1&sess=1&pid=11101000&rp=99999"
response = requests.get(url)
soup = BeautifulSoup(response.content,  "html.parser")

card_name = soup.find_all('strong')
print(card_name)

lob_2002 = open("Legend of Blue Eyes 2002 - Cards Names", "w")
lob_2002.write

Извините, если не все имеет смысл. Я попытался объяснить свои мысли, не будучи слишком длинным.

Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Введение в технологический стек Twitch
Введение в технологический стек Twitch
В этой статье мы подробно рассмотрим стек Twitch, который подразделяется на следующий набор технологий:
8 полезных HTML-тегов, которые лучше использовать вместо <div>
8 полезных HTML-тегов, которые лучше использовать вместо <div>
Когда я только начинал изучать html, я использовал div для всего, это был один из первых тегов, которые я выучил, и казалось, что он работает в любой...
HTML5: API локального хранилища (Local Storage)
HTML5: API локального хранилища (Local Storage)
LocalStorage - это простой способ хранения данных в браузере пользователя.
Доступность HTML - программирование с инклюзивной перспективой
Доступность HTML - программирование с инклюзивной перспективой
Представьте, что вы хотите поехать на пляж. Представьте, что вы упорно трудились весь год и заслужили это. Прибыв на место, вы обнаруживаете, что...
Именование классов CSS: Конвенция именования BEM
Именование классов CSS: Конвенция именования BEM
Сопровождаемость кода, сама по себе, является пульсирующим эффектом нескольких факторов. Когда часть программного обеспечения читабельна, ясна,...
1
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

soup.find_all() фактически возвращает список. Он может быть пустым, с 1 элементом или со 128, как в вашем примере. Вы успешно получили список сильных элементов, но чтобы извлечь значения из каждого тега, вам нужно перебрать список и вызвать .text для каждого. Как это

names = [name.text for name in card_name]

Затем это список строк, и вы можете его сохранить. Поскольку это список, вам нужно либо преобразовать его в строку и записать, либо повторить итерацию и записать каждый новый элемент в новую строку, либо использовать формат json, например, с json.dump()

# option 1
lob_2002.write(str(names))

# option 2
for name in names:
    lob_2002.write(name)

# option 3
lob_2002.write(json.dumps(names))

UPD: По остальным вопросам.

If I'm trying to grab classes, it should be the same process I'm using now just swapping with the class name correct?

Да, вы можете использовать find() для одного (первого) элемента, или find_all(), или взгляните на select() и select_one(), где вы можете применять селекторы CSS. Также для таких целей можно было бы использовать XPath, но я думаю, что BeautifulSoup его не поддерживает, а другие библиотеки поддерживают.

... so would I be able to get say the second image without having to get the others?

Вы либо используете find_all("img")[1], который ищет все изображения, а затем выбирает конкретное. Если бы это было первое изображение, find("img") сработало бы. Вероятно, soup.select("img:nth-of-type(2)") мог бы работать, но почему-то вместо того, чтобы вернуть мне второе изображение, он возвращает все. Либо баг, либо я что-то не так делаю.

Кроме того, для действительно конкретного элемента DOM рассмотрите возможность применения селекторов class и id, например soup.find("span", {"class": "some_class", "id": "some_id"})

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