Извлечение информации из кода тега CSS с BeautifulSoup

1

Я пытаюсь извлечь некоторую информацию с сайта с помощью библиотеки 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)
  • 0
    Добро пожаловать в Stackoverflow! Для воспроизведения вашей проблемной среды мне может понадобиться URL сайта, который вы пытаетесь очистить. Можете ли вы предоставить это?
  • 0
    ссылка курсив жирный code
Показать ещё 1 комментарий
Теги:
beautifulsoup

2 ответа

1

Ваш код верен с точки зрения поиска элементов на 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()
  • 0
    Я согласен с вашим ответом. Но нет ли способа поковыряться на сайте instagram?
  • 0
    Я добавил пример Selenium.
Показать ещё 4 комментария
-2

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)

  • 1
    Ошибка не из-за списка. Он пытается получить данные из Instagram с такими же запросами. Ошибка вызвана тем, что супа нет. Вы должны помочь ему с этим.
  • 1
    Его вопрос состоял в том, как извлечь "68" из HTML <span class="g47SY ">68</span> , и на этот вопрос я ответил. Правильный ответ - плохой стиль.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню