Извлечение информации из кода тега CSS с BeautifulSoup - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь извлечь некоторую информацию с сайта с библиотекой 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)

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

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)

0 голосов
/ 28 августа 2018

Ваш код правильный с точки зрения поиска элементов на HTML-странице. Проблема в самой странице Instagram. Если вы посмотрите на его источник (а не на панель «Элементы DevTools»), вы увидите, что он почти пустой. 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...