在Python中使用Selenium进行Webscraping

时间:2017-10-26 15:28:40

标签: python python-3.x selenium

我正在尝试使用BeautifulSoup库和Selenium包从Sunshine List网站(http://www.sunshinelist.ca/)获取数据(以便处理网页上的“下一步”按钮)。我知道有几个相关的帖子,但我无法确定我应该在哪里以及如何明确要求司机等待。

  

错误:StaleElementReferenceException:消息:元素引用   陈旧:要么元素不再附加到   DOM或页面已刷新

这是我写的代码:

import numpy as np
import pandas as pd
import requests
import re
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

ffx_bin = FirefoxBinary(r'C:\Users\BhagatM\AppData\Local\Mozilla Firefox\firefox.exe')
ffx_caps = DesiredCapabilities.FIREFOX
ffx_caps['marionette'] = True
driver = webdriver.Firefox(capabilities=ffx_caps,firefox_binary=ffx_bin)
driver.get("http://www.sunshinelist.ca/")
driver.maximize_window()

tablewotags1=[]

while True:
    divs = driver.find_element_by_id('datatable-disclosures')
    divs1=divs.find_elements_by_tag_name('tbody')

    for d1 in divs1:
        div2=d1.find_elements_by_tag_name('tr')
        for d2 in div2:
            tablewotags1.append(d2.text)

    try:
        driver.find_element_by_link_text('Next →').click()
    except NoSuchElementException:
        break

year1=tablewotags1[0::10]
name1=tablewotags1[3::10]
position1=tablewotags1[4::10]
employer1=tablewotags1[1::10]  


df1=pd.DataFrame({'Year':year1,'Name':name1,'Position':position1,'Employer':employer1})
df1.to_csv('Sunshine List-1.csv', index=False)

1 个答案:

答案 0 :(得分:0)

我认为你只需要指向正确的firefox二进制文件。另外,您使用的是哪个版本的Firefox?看起来它是较新版本之一,如果是这样的话应该这样做。

import csv   # You are missing this import
ls_general_list = []

def csv_for_me(list_to_csv):
    with open(pathtocsv, 'a', newline='') as csvfile:
        sw = csv.writer(csvfile, delimeter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
        for line in list_to_csv:
            for data in line:
                sw.writerow(data)

干杯

编辑:所以为了回答你的新问题,“为什么不写CVS”你应该这样做:

df=pd.DataFrame({'Year':year,'Name':name,'Position':position,'Employer':employer})

然后在您的代码ls.general_list.append(('Year':year,'Name':name,'Position':position,'Employer':employer))

中替换它

这个,csv_for_me(ls_general_list)

然后这样做, {{1}}

请接受答案,如果它是令人满意的,现在你有一个csv