Веб-скрейпинг 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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
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"})

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