#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’, и все получилось отлично. Спасибо.