调用“onclick”时出现问题事件使用PyQt &javascript
Issue in invoking "onclick" event using PyQt & javascript
我正试图从一个网站使用美丽的汤刮数据。默认情况下,此网页显示18个项目,点击javascript按钮"showAlldevices"后,所有41个项目都可见。Beautiful soup仅为默认情况下可见的项目抓取数据,为了获取所有项目的数据,我使用PyQt模块并使用javascript代码调用click事件。下面是引用的代码:
import csv
import urllib2
import sys
import time
from bs4 import BeautifulSoup
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *
class Render(QWebPage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().load(QUrl(url))
self.app.exec_()
def _loadFinished(self, result):
self.frame = self.mainFrame()
self.app.quit()
url = 'http://www.att.com/shop/wireless/devices/smartphones.html'
r = Render(url)
jsClick = """var evObj = document.createEvent('MouseEvents');
evObj.initEvent('click', true, true );
this.dispatchEvent(evObj);
"""
allSelector = "a#deviceShowAllLink"
allButton = r.frame.documentElement().findFirst(allSelector)
allButton.evaluateJavaScript(jsClick)
html = allButton.webFrame().toHtml()
page = html
soup = BeautifulSoup(page)
soup.prettify()
with open('Smartphones_26decv2.0.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=',')
spamwriter.writerow(["Date","Day of Week","Device Name","Price"])
items = soup.findAll('a', {"class": "clickStreamSingleItem"},text=True)
prices = soup.findAll('div', {"class": "listGrid-price"})
for item, price in zip(items, prices):
textcontent = u' '.join(price.stripped_strings)
if textcontent:
spamwriter.writerow([time.strftime("%Y-%m-%d"),time.strftime("%A") ,unicode(item.string).encode('utf8').strip(),textcontent])
我正在使用这行代码html = allButton.webFrame().toHtml()
为美丽的汤提供html。这段代码运行时没有任何错误,但我仍然没有在输出csv
我还尝试用这些行代码将html添加到美丽的汤中:
allButton = r.frame.documentElement().findFirst(allSelector)
a = allButton.evaluateJavaScript(jsClick)
html = a.webFrame.toHtml()
page = html
soup = BeautifulSoup(page)
但是我遇到了这个错误:html = a.webFrame.toHtml()
AttributeError: 'QVariant' object has no attribute 'webFrame'
请原谅我的无知,如果我在这里问任何基本的,因为我是一个新的编程和帮助我解决这个问题。
我认为你的JavaScript代码有问题。因为你正在创建一个MouseEvent
对象,你应该使用initMouseEvent
方法进行初始化。您可以在这里找到一个示例。
更新2
但我认为最简单的认为你可以尝试的是使用a
元素的JavaScript DOM方法onclick
,而不是使用自己的JavaScript代码。像这样:
allButton.evaluateJavaScript("this.onclick()")
应该工作。我想在将页面传递给解析器之前,您必须在单击后重新加载页面。
更新3
你可以通过r.action(QWebPage.ReloadAndBypassCache)
或r.action(QWebpage.Reload)
重新加载页面,但它似乎没有任何效果。我试着用QWebView
显示页面,点击链接,看看会发生什么。不幸的是,我得到了很多分割错误,所以我发誓在PyQt4/Qt4的某个地方有一个bug。由于页面被废弃使用jquery,我也试图在QWebPage
中加载jquery后显示它,但再次没有运气(分段错误不会消失)。我要放弃了:(我希望在SO的其他用户会帮助你。无论如何,我建议您向PyQt4邮件列表寻求帮助。它们为PyQt用户提供了出色的支持。
更改代码时得到的错误是预期的:记住allButton
是QWebElement
对象。QWebElement.evaluateJavaScript
方法返回一个QVariant
对象(如文档中所述),这种对象没有webFrame
属性,您可以查看此页。
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 对iPad上的点击事件反应缓慢
- 事件和状态
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- 从控制器返回后Ajax启动事件激发
- 如何从画布上的某个移动事件中获取X和Y
- Jquery:未触发select事件
- JsFiddle上的鼠标事件不起作用
- 只覆盖箭头键滚动事件
- $window.ga在AngularJS事件中未定义
- cron作业与Javascript计时事件
- 调用“onclick”时出现问题事件使用PyQt &javascript