2016-12-15 4 views
2

Я выполняю процесс, в котором я направляю Python на веб-сайт и инструктирую Python искать адреса, которые у меня есть в моем файле csv на указанном веб-сайте. Я хочу сказать Python, чтобы сохранить результаты для каждого отдельного значения адреса с веб-сайта в CSV-файл.сохранение скребковых данных в файл csv

from selenium import webdriver 
from bs4 import BeautifulSoup 
import time 
import csv 


driver = webdriver.Chrome("C:\Python27\Scripts\chromedriver.exe") 
chrome = driver.get('https://etrakit.friscotexas.gov/Search/permit.aspx') 
with open('C:/Users/thefirstcolumnedited.csv','r') as f: 
    addresses = f.readlines() 

    for address in addresses: 
     driver.find_element_by_css_selector('#cplMain_txtSearchString').clear()  
     driver.find_element_by_css_selector('#cplMain_txtSearchString').send_keys(address) 
     driver.find_element_by_css_selector('#cplMain_btnSearch').click() 
     time.sleep(5) 

    soup = BeautifulSoup(chrome, 'html.parser') 

    writer = csv.writer(open('thematchingresults.csv', 'w')) 
    writer.writerow(soup) 

Например:

6579 Mountain Sky Rd 

Значение адреса выше извлекает пять строк данных на веб-сайте. Как я могу сказать Beautiful Soup, чтобы сохранить результаты для каждого значения адреса в файле csv?

ответ

1

Идея состоит в том, чтобы записать в CSV-файл (ы) внутри цикла (если вы хотите создать один файл csv для всех входных адресов, используйте a «append»). Что касается извлечения результатов, я бы explicitly wait (time.sleep() ненадежно и, как правило, медленнее, чем это должно быть) для результатов table элемента (элемент с id="ctl00_cplMain_rgSearchRslts_ctl00"), а затем использовать pandas.read_html() читать table в dataframe, который мы то удобно сбрасывать в файл CSV с помощью .to_csv():

import pandas as pd 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

# ... 

wait = WebDriverWait(driver, 10) 

for address in addresses: 
    driver.find_element_by_css_selector('#cplMain_txtSearchString').clear() 
    driver.find_element_by_css_selector('#cplMain_txtSearchString').send_keys(address) 
    driver.find_element_by_css_selector('#cplMain_btnSearch').click() 

    # wait for the results table 
    table = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_cplMain_rgSearchRslts_ctl00"))) 

    # make a dataframe and dump the results 
    df = pd.read_html(table.get_attribute("outerHTML"))[0] 
    with open('thematchingresults.csv', 'a') as f: 
     df.to_csv(f) 

Для одного адреса «6579 Mountain Sky Rd», содержимое thematchingresults.csv после запуска скрипта будет:

,Permit Number,Address,Street Name,Applicant Name,Contractor Name,SITE_SUBDIVISION,RECORDID 
0,B13-2809,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,SHADDOCK HOMES LTD,SHADDOCK HOMES LTD,PCR - SHERIDAN,MAC:1308050328358768 
1,B13-4096,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,MIRAGE CUSTOM POOLS,MIRAGE CUSTOM POOLS,PCR - SHERIDAN,MAC:1312030307087756 
2,L14-1640,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,TDS IRRIGATION,TDS IRRIGATION,SHERIDAN,ECON:140506012624706 
3,P14-0018,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,MIRAGE CUSTOM POOLS,,SHERIDAN,LCR:1401130949212891 
4,ROW14-3205,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,Housley Group,Housley Group,,TLW:1406190424422330 

Надеюсь, что это хорошая отправная точка для вас.