javascript - 抓取——使用 PyQt4 从 JS 生成的页面中缺少 <dt> 标记的文本元素

标签 javascript web-scraping beautifulsoup pyqt pyqt4

我正在尝试抓取 this page使用 PyQt4 但由于某种原因 <dt> 的文本元素当我使用 BeautifulSoup 进行搜索时,标签没有显示。

我对使用 PyQt4 还很陌生,所以我不确定这里出了什么问题。我得到了文本标签的所有文本元素,但没有得到 .页面是否未完全加载或出了什么问题?感谢您的帮助。

这是我目前使用的代码:

class Client(QWebPage):
    def __init__(self, url):
         print('\n\nLoading: \n', url)
         self.app = QApplication(sys.argv)
         QWebPage.__init__(self)
         self.loadFinished.connect(self.on_page_load)
         self.mainFrame().load((QUrl(url)))
         self.app.exec()
         self.app.quit()

    def on_page_load(self):
        self.app.quit()

url = 'http://www.hkex.com.hk/Market-Data/Securities-Prices/Equities/Equities-Quote?sym=700&sc_lang=en'

client_response = Client(url)

source = client_response.mainFrame().toHtml()
soup = bs.BeautifulSoup(source, 'lxml')


table = soup.find('div', {'class' : 'left_list_leve quote'})

price =  soup.find('span' , {'class' : 'col_last'})
name = soup.find('p' , {'class' : 'col_name'})
all_dls = table.findAll('dl')

这是我运行脚本后得到的结果。

   Loading:
 http://www.hkex.com.hk/Market-Data/Securities-Prices/Equities/Equities-Quote?sym=700&sc_lang=en
[<dl>
<dd class="ico_name label_prevcls">PREV. CLOSE*</dd>
<dt class="ico_data col_prevcls"></dt>
</dl>, <dl>
<dd class="ico_name label_open">OPEN**</dd>
<dt class="ico_data col_open"></dt>
</dl>, <dl>
<dd class="ico_name label_turnover">TURNOVER</dd>
<dt class="ico_data col_turnover"></dt>
</dl>, <dl>
<dd class="ico_name label_volume">VOLUME</dd>
<dt class="ico_data col_volume"></dt>
</dl>, <dl>
<dd class="ico_name label_mktcap">MKT CAP</dd>
<dt class="ico_data col_mktcap"></dt>
</dl>, <dl>
<dd class="ico_name label_lotsize">LOT SIZE</dd>
<dt class="ico_data col_lotsize"></dt>
</dl>, <dl>
<dd class="ico_name label_bid">BID</dd>
<dt class="ico_data col_bid"></dt>
</dl>, <dl>
<dd class="ico_name label_ask">ASK</dd>
<dt class="ico_data col_ask"></dt>
</dl>, <dl>
<dd class="ico_name label_eps">EPS</dd>
<dt class="ico_data col_eps"></dt>
</dl>, <dl>
<dd class="ico_name label_pe">P/E</dd>
<dt class="ico_data col_pe"></dt>
</dl>, <dl>
<dd class="ico_name label_divyield">DIV YIELD</dd>
<dt class="ico_data col_divyield"></dt>
</dl>]
<span class="col_last"></span>
<p class="col_name"></p>

最佳答案

您缺少 _loadFinished() 方法。

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui, QtWebKit
from PyQt4.QtGui import *
import bs4 as bs
import sys


class Client(QtWebKit.QWebPage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QtWebKit.QWebPage.__init__(self)
        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QtCore.QUrl(url))
        self.app.exec_()

    def _loadFinished(self, result):
        self.frame = self.mainFrame()
        self.app.quit()


url = 'http://www.hkex.com.hk/Market-Data/Securities-Prices/Equities/Equities-Quote?sym=700&sc_lang=en'

client_response = Client(url)

source = client_response.frame.toHtml()
u =  (unicode(source).encode("utf-8", errors="replace"))
soup = bs.BeautifulSoup(u, 'lxml')

table = soup.find('div', {'class': 'left_list_leve quote'})

price = soup.find('span', {'class': 'col_last'})
name = soup.find('p', {'class': 'col_name'})
all_dls = table.findAll('dl')

for dl in all_dls:
    print (dl)

输出:

<dl>
<dd class="ico_name label_prevcls">PREV. CLOSE*</dd>
<dt class="ico_data col_prevcls">HK$460.000</dt>
</dl>
<dl>
<dd class="ico_name label_open">OPEN**</dd>
<dt class="ico_data col_open">HK$459.000</dt>
</dl>
<dl>
<dd class="ico_name label_turnover">TURNOVER</dd>
<dt class="ico_data col_turnover">HK$11.08B</dt>
</dl>
<dl>
<dd class="ico_name label_volume">VOLUME</dd>
<dt class="ico_data col_volume">24.33M</dt>
</dl>
<dl>
<dd class="ico_name label_mktcap">MKT CAP</dd>
<dt class="ico_data col_mktcap">HK$4,297.37B</dt>
</dl>
<dl>
<dd class="ico_name label_lotsize">LOT SIZE</dd>
<dt class="ico_data col_lotsize">100</dt>
</dl>
<dl>
<dd class="ico_name label_bid">BID</dd>
<dt class="ico_data col_bid">HK$452.400</dt>
</dl>
<dl>
<dd class="ico_name label_ask">ASK</dd>
<dt class="ico_data col_ask">HK$452.600</dt>
</dl>
<dl>
<dd class="ico_name label_eps">EPS</dd>
<dt class="ico_data col_eps">RMB4.383</dt>
</dl>
<dl>
<dd class="ico_name label_pe">P/E</dd>
<dt class="ico_data col_pe">91.55x</dt>
</dl>
<dl>
<dd class="ico_name label_divyield">DIV YIELD</dd>
<dt class="ico_data col_divyield">0.13%</dt>
</dl>

关于javascript - 抓取——使用 PyQt4 从 JS 生成的页面中缺少 <dt> 标记的文本元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48607341/

相关文章:

php - Xpath 返回错误的输出,而不是浏览器中 XPath 帮助程序的输出

Python、Beautiful Soup 和 cron

python - 在Python中使用BeautifulSoup提取表标签值?

python-3.x - 使用 BeautifulSoup 和 ftlib 访问 ftp 网站时出错

javascript 音频语法可能是错误的?

javascript - 获取 <img/> 的绝对路径

python-3.x - 使用提交按钮使用 Python 下载文件

python - 为什么我从网络抓取中得到空列表?

javascript - Jquery ajax请求不能在FF和safari中工作,在chrome中工作

Javascript递归函数性能下降