Problemas al invocar el “evento de clic en” en la página html con una sopa hermosa en Python

Estoy tratando de raspar los nombres de todos los elementos presentes en la página web, pero por defecto solo 18 están visibles en la página y mi código los está raspando solo. Puede ver todos los elementos haciendo clic en el botón “Mostrar todo”, pero ese botón está en Javascript.

Después de algunas investigaciones, descubrí que el módulo PyQt se puede usar para resolver este problema relacionado con los botones de javascript y lo usé, pero todavía no puedo invocar el evento “de clic”. A continuación se muestra el código referido:

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" # This is the css selector you actually need allButton = r.frame.documentElement().findFirst(allSelector) allButton.evaluateJavaScript(jsClick) page = allButton soup = BeautifulSoup(page) soup.prettify() with open('Smartphones_26decv1.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]) 

El error al que me enfrento en esto es el siguiente:

 "Invalid Syntax" Error for evObj 

¿Puede alguien ayudarme a invocar este evento “onclick” para poder rastrear datos de todos los artículos? Perdóneme por mi ignorancia ya que soy nuevo en la progtwigción.

Para hacer clic en el botón debe llamar a evaluateJavascript sobre el objeto:

 jsClick = """var evObj = document.createEvent('MouseEvents'); evObj.initEvent('click', true, true ); this.dispatchEvent(evObj); """ allSelector = "a#deviceShowAllLink" # This is the css selector you actually need allButton = r.frame.documentElement().findFirst(allSelector) allButton.evaluateJavaScript(jsClick) 
 from contextlib import closing from selenium.webdriver import Firefox # pip install selenium from selenium.webdriver.support.ui import WebDriverWait from BeautifulSoup import BeautifulSoup from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC # use firefox to get page with javascript generated content with closing(Firefox()) as driver: driver.get("http://www.att.com/shop/wireless/devices/smartphones.html") button = driver.find_element_by_id('deviceShowAllLink') button.click() # wait for the page to load element = WebDriverWait(driver, 10).until( EC.invisibility_of_element_located((By.ID, "deviceShowAllLink")) ) # store it to string variable page_source = driver.page_source soup = BeautifulSoup(page_source) items = soup.findAll('div', {"class": "list-item"}) print "items count:",len(items) 

¿Esto ayudará …?