Я пытаюсь извлечь некоторую информацию с сайта с помощью библиотеки Python BeautifulSoup
. В частности, я хочу извлечь информацию из этого кода ccs:
<span class="g47SY ">68</span>
Использование команды find_all
не работает, и я не понимаю ошибки. Вы можете мне помочь?
Это мой код
import requests
from bs4 import BeautifulSoup
url = 'https://www.exemple.com/'
r = requests.get(url)
html_as_string = r.text
soup = BeautifulSoup(html_as_string, 'html.parser')
# print(soup.prettify())
# I want to extract 68 from <span class="g47SY ">68</span>
info = soup.find_all("span", class_="g47SY")
print (info)
Ваш код верен с точки зрения поиска элементов на HTML-странице. Проблема заключается в самой странице Instagram. Если вы посмотрите на его источник (а не на панель элементов DevTools Elements), вы увидите, что он почти пуст. Instagram построен полностью с использованием JavaScript-анти-шаблона, но прочно укоренился, поэтому элементы, которые вы ищете, существуют только на клиенте после запуска JavaScript.
Вы можете сделать это, используя Selenium, который в основном открывает сайт в браузере и делает все, что делает обычный браузер. Например:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# initialization
driver = webdriver.Firefox()
driver.get("https://www.instagram.com/antedoro/")
try:
# wait up to 10 seconds for the parent of the spans to be present
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "Y8-fY")))
# locate the spans
spans = driver.find_elements_by_css_selectors("span.g47SY")
text_of_spans = [span.text for span in spans]
finally:
driver.close()
find_all
возвращает список, поэтому вам нужно выбрать первый элемент. Затем используйте свойство text
. Как это:
# I want to extract 68 from <span class="g47SY ">68</span>
info = soup.find_all("span", class_="g47SY")
print(info[0].text)
(Почему downvote? Я только что протестировал его, работает в bs4)
<span class="g47SY ">68</span>
, и на этот вопрос я ответил. Правильный ответ - плохой стиль.
code