Табличные данные, возвращающие пустые значения после веб-очистки

#html #python-3.x #web-scraping #beautifulsoup #urllib

#HTML #python-3.x #веб-очистка #beautifulsoup #urllib

Вопрос:

Я попытался веб-очистить данные таблицы с веб-сайта binary signals. Данные обновляются через некоторое время, и я хотел получать данные по мере их обновления. Проблема в том, что когда я очищаю код, он возвращает пустые значения. Таблица имеет тег table.

Я не уверен, использует ли он что-то еще, кроме html, потому что он обновляется без перезагрузки. Мне пришлось использовать пользовательский агент браузера, чтобы пройти проверку безопасности.

Когда я запускаю, он возвращает правильные данные, но я заметил, что идентификатор сигнала увеличивается на 1

 <table class="ui stripe hover dt-center table" id="isosignal-table" style="width:100%"><thead><tr><th></th><th class="no-sort">Current Price</th><th class="no-sort">Direction</th><th class="no-sort">Asset</th><th class="no-sort">Strike Price</th><th class="no-sort">Expiry Time</th></tr></thead><tbody><tr :class="[ signal.direction.toLowerCase() == 'call' ? 'call' : 'put' ]" :id="'signal-'   signal.id" :key="signal.id" ref="signals" v-for="signal in signals"><td style="display: none;" v-text="signal.id"></td><td v-text="signal.current_price"></td><td v-html="showDirection(signal.direction)"></td><td v-text="signal.asset"></td><td v-text="signal.strike_price"></td><td v-text="parseTime(signal.expiry)"></td></tr></tbody></table>


table = soup.table
print(table)
  

Но когда я запускаю весь код, он возвращает это:
[]
[», », », », », »]

 from bs4 import BeautifulSoup
from urllib.request import Request, urlopen

url = "https://signals.investingstockonline.com/free-binary-signal-page"
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
page = urlopen(req)
data = page.read()

soup = BeautifulSoup(data, 'html.parser')
table = soup.table
table_rows = table.find_all('tr')

for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    if len(row) < 1:
         pass
    print(row)
  

Я думал, что это отобразит всю таблицу, но она просто отобразила пустые строки. В чем может быть проблема?

Ответ №1:

В предоставленном вами HTML текстовом содержимом элементов нет, так что вы все поняли правильно. Когда вы смотрите на веб-сайт в реальном времени, текстовое содержимое, которое появляется в таблице, было вставлено динамически с помощью JS, извлекающей информацию с сервера через ajax. Другими словами, если вы выполните запрос, вы получите скелет (HTML), но без мяса (текущие данные).

Вы можете использовать что-то вроде Selenium для извлечения этой информации следующим образом:

 from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()  
chrome_options.add_argument("--headless")  
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://signals.investingstockonline.com/free-binary-signal-page")

for tr in driver.find_elements_by_tag_name("tr"):
    for td in tr.find_elements_by_tag_name("td"):
        print(td.get_attribute("innerText"))
  

Вывод (усеченный):

 EURJPY
126.044
22:00:00
1.50318

EURCAD
1.50332
22:00:00
1.12595

EURUSD
1.12604
22:00:00
0.86732

EURGBP
0.86743
22:00:00
1.29825

GBPUSD
1.29841
22:00:00
145.320
  

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

1. Спасибо ggorlen за ваш ответ. Я был настроен скептически, когда увидел, что строки добавляются динамически. К сожалению, я использую версию Селена для Firefox, как она переводится, потому что она не запускается?

2. Спасибо @ggorlen, я только что изменил все параметры Chrome на.

3. @MarkGacoka если ответ решил проблему, принято принимать решение.

4. ОК. Я в основном изменил весь ‘Chrome’ на ‘Firefox’, и все получилось отлично. Спасибо.