[Python] 아름다운 스프를 사용하여 html 페이지에서 "클릭 이벤트 발생"과 관련된 문제


Answers

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)

이게 도움이 될거야 ..?

Question

나는 웹 페이지에있는 모든 항목의 이름을 긁어 내려고 노력하고 있지만 기본적으로 18 개만 페이지에 표시되고 내 코드는 그만 긁어 모으고 있습니다. "모두 표시"버튼을 클릭하면 모든 항목을 볼 수 있지만 해당 버튼은 자바 스크립트로 표시됩니다.

몇 가지 연구를 한 후 PyQt 모듈을 사용하여 자바 스크립트 버튼과 관련된이 문제를 해결할 수 있었지만 사용했지만 여전히 "클릭"이벤트를 호출 할 수는 없습니다. 아래는 참조 된 코드입니다.

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])

내가 직면 한 오류는 다음과 같습니다.

"Invalid Syntax" Error for evObj

누군가가이 "onclick"이벤트를 호출하여 모든 항목에 대한 데이터를 다룰 수있게 도와 주시겠습니까? 프로그래밍에 익숙하지 않으므로 저를 용서해주십시오.