html - Web 抓取后表数据返回空值

标签 html python-3.x web-scraping beautifulsoup urllib

我试图从一个二进制信号网站上抓取表格数据。一段时间后数据更新,我想在数据更新时获取数据。问题是,当我抓取代码时,它返回空值。该表有一个表标签。

我不确定它是否使用 html 以外的其他东西,因为它无需重新加载即可更新。我必须使用浏览器用户代理才能通过安全检查。

当我运行时它返回正确的数据,但我注意到信号 ID 增加了 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)

我以为它会显示整个表格,但它只显示空字符串。可能是什么问题?

最佳答案

在您提供的 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

关于html - Web 抓取后表数据返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55802924/

相关文章:

html - 伪元素中的 Internet Explorer Material 图标不起作用

html - 子域忽略链接样式表的边距?

python-3.x - Tkinter Treeview 背景标签不起作用

python - 不确定如何从网络上抓取可能位于多个不同位置的特定值

html - 用 R 抓取 .asp 网站

mysql - 在Node js中设置每个请求的间隔

html - 在 dataTable 列中创建一个异步事件并根据响应呈现一个按钮

html - bootstrap carousel active item 内的文本与外部文本对齐

python-3.x - 如何使用 pandas 与其他数据框相比填充行之间的间隙?

python-3.x - 将 numba 与 time.clock() 和 timeit 一起使用