【问题标题】:Table data returning empty values after web scraping网页抓取后表数据返回空值
【发布时间】:2019-04-23 01:01:39
【问题描述】:

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

我不确定它是否使用 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 python-3.x web-scraping beautifulsoup urllib


    【解决方案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
    

    【讨论】:

    • 感谢 ggorlen 的回答。当我看到动态添加的行时,我持怀疑态度。不幸的是,我使用的是 Firefox 版本的 Selenium,因为它不运行,它是如何翻译的?
    • 谢谢@ggorlen,我刚刚把每个chrome都改成了option。
    • @MarkGacoka 如果答案解决了问题,则习惯性地接受解决方案。
    • 好的。我基本上把所有的“Chrome”都改成了“Firefox”,一切都很顺利。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多