BeautifulSoup, lmxl не загружает текст во время загрузки

#python #beautifulsoup #lxml

#python #beautifulsoup #lxml

Вопрос:

Я пытаюсь загрузить данные с веб-сайта, все работает нормально, за исключением случаев, когда он сталкивается с датами, он просто возвращает «». Я просмотрел HTML, загруженный в программу, и в нем ничего нет между тегами, поэтому он ничего не возвращает. Когда вы просматриваете html онлайн, вы можете четко видеть его там. У кого-нибудь есть какие-либо идеи?

 from bs4 import BeautifulSoup
import requests

stocks=["3PL"]

keys = list()
values = list()

for stock in stocks:
    source = requests.get(r"https://www.reuters.com/companies/"   stock   ".AX/key-metrics").text
    soup = BeautifulSoup(source, 'lxml')
    for data in soup.find_all("tr", class_="data"):
        keys.append(data.th.text)
        if data.td.text != "--":
            values.append(data.td.text)
        else:
            values.append("nan")

print(keys[3])
print(values[3])                    #This should return the date
  

Комментарии:

1. Кажется, что данные, которые вы ищете, просто отсутствуют при загрузке страницы с запросами. Возможно, вы захотите попробовать это с помощью реального браузера и selenium

Ответ №1:

Казалось бы, ваши данные добавлены с помощью javascript. Это то, что запросы не будут обрабатывать, поскольку это не будет отображать страницу как обычные браузеры. Извлекайте только необработанные данные.

Однако вы можете использовать selenium пакет, чтобы сделать это успешно. Чтобы установить это:

 pip install selenium
  

Возможно, вам потребуется настроить некоторые веб-драйверы для использования Firefox или Chrome. Но в приведенном ниже случае я использовал браузер, который работал из коробки, будучи Safari.

Я немного скорректировал ваш код, чтобы использовать пакет selenium, и поместил ваши данные в dict, чтобы сохранить лучшую согласованность.

 from bs4 import BeautifulSoup
from selenium import webdriver
import requests

stocks=["3PL"]

response_data = {}
driver = webdriver.Safari()

for stock in stocks:
    url = r"https://www.reuters.com/companies/"   stock   ".AX/key-metrics"
    driver.get(url)
    source = driver.page_source
    soup = BeautifulSoup(source)
    for data in soup.find_all("tr", class_="data"):
        if data.td.text != "--":
            response_data[data.th.text] = data.td.text
        else:
            response_data[data.th.text] = 'nan'

driver.close()
  

Теперь вы можете проверить, правильно ли загружены данные:

 print(response_data['Pricing date'])
Sep-04