В этом семестре я дал себе побочный проект, содержание которого мы вообще не освещаем. Я пытаюсь взять контент с сайта (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
Извините, если не все имеет смысл. Я попытался объяснить свои мысли, не будучи слишком длинным.
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"})