gpt4 book ai didi

javascript - 使用 PyQt 和 javascript 调用 "onclick"事件时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:54 25 4
gpt4 key购买 nike

我正在尝试使用 beautiful soup 从网站上抓取数据。默认情况下,此网页显示 18 个元素,在单击 javascript 按钮“showAlldevices”后,所有 41 个元素都可见。 Beautiful soup 只为默认可见的元素抓取数据,以获取我使用 PyQt 模块并使用 javascript 代码调用点击事件的所有元素的数据。以下是引用代码:

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 喂给美丽的汤获取输出 csv 中所有 41 项的数据

我还尝试使用这些代码行将 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' 对象没有属性 'webFrame'

如果我在这里问任何基本问题,请原谅我的无知,因为我是编程新手并帮助我解决了这个问题。

最佳答案

我认为您的 JavaScript 代码有问题。由于您正在创建 MouseEvent 对象,因此您应该使用 initMouseEvent 方法进行初始化。你可以找到一个例子 here .

更新 2

但我认为您可以尝试的最简单的想法是使用 a 元素的 JavaScript DOM 方法 onclick 而不是使用您自己的 JavaScript 代码。像这样:

allButton.evaluateJavaScript("this.onclick()")

应该可以。我想您必须在单击后重新加载页面,然后再将其传递给解析器。

更新 3

您可以通过r.action(QWebPage.ReloadAndBypassCache)r.action(QWebpage.Reload) 重新加载页面,但它似乎没有任何效果.我尝试用 QWebView 显示页面,单击链接,看看会发生什么。不幸的是,我遇到了很多 Segmentation Fault 错误,所以我发誓 PyQt4/Qt4 中某处存在错误。由于被废弃的页面使用 jquery,我也尝试在 QWebPage 中加载 jquery 后显示它,但还是没有成功(段错误不会消失)。我要放弃了:(我希望 SO 的其他用户能帮助你。无论如何,我建议你向 the PyQt4 mailing list 寻求帮助。他们为 PyQt 用户提供了很好的支持。

更新

更改代码时出现的错误是预料之中的:请记住 allButton 是一个 QWebElement 对象。并且 QWebElement.evaluateJavaScript 方法返回一个 QVariant 对象(如 the docs 中所述)并且这种对象没有 webFrame属性,您可以查看评论this page .

关于javascript - 使用 PyQt 和 javascript 调用 "onclick"事件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14050585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com