2016-07-27 2 views
0
import urllib2  
from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.common.keys import Keys 

url = ("http://www.justdial.com/Mumbai/CA")  
driver = webdriver.Firefox()  
driver.get(url) 

driver 

elements = driver.find_elements_by_xpath('//div[@class="col-md-12 col-xs-12 padding0"]') 

for e in elements:  
    print e.text  
url = driver.current_url  
company_name = driver.find_element_by_xpath('//span[@class="jcn"]').text 

contact_number = driver.find_element_by_xpath('//p[@class="contact_info"]').text  
address = driver.find_element_by_xpath('//p[@class="adress_info"]').text  
address_info = driver.find_element_by_xpath('//p[@class="address-info adinfoex"]').text 

estd = driver.find_element_by_xpath('//li[@class="fr"]').text  
ratings = driver.find_element_by_xpath('//li[@class="last"]').text 

tf = 'textfile.csv'  
f2 = open(tf, 'a+') 

f2.write(', '.join([data.encode('utf-8') for data in [company_name]]) + ',')  
f2.write(', '.join([data.encode('utf-8') for data in [contact_number]]) + ',')  
f2.write(', '.join([data.encode('utf-8') for data in [address]]) + ',')  
f2.write(', '.join([data.encode('utf-8') for data in [address_info]]) + ',')  
f2.write(', '.join([data.encode('utf-8') for data in [estd_ratings]]) + '\n') 

f2.close() 

답변

0

다음을 시작해야합니다. 중요한 것은 xpath 항목이 필요한 항목을 정확히 선택하도록하는 것입니다. 당신이 뭔가를 찾고 CSV 파일을 줄 것이다

import csv 
import urllib2  
from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.common.keys import Keys 

def get_elements_by_xpath(driver, xpath): 
    return [entry.text for entry in driver.find_elements_by_xpath(xpath)] 


url = ("http://www.justdial.com/Mumbai/CA")  
driver = webdriver.Firefox()  
driver.get(url) 

search_entries = [ 
    ("CompanyName",  "//span[@class='jcn']"), 
    ("ContactNumber", "//p[@class='contact-info']/span/a"), 
    ("Address",   "//span[@class='desk-add jaddt']"), 
    ("AddressInfo",  "//p[@class='address-info adinfoex']"), 
    ("Estd",   "//li[@class='fr']"), 
    ("Ratings",   "//li[@class='last']/a/span[@class='rt_count']")] 

with open('textfile.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 

    # Write header 
    csv_output.writerow([name for name, xpath in search_entries]) 
    entries = [] 

    for name, xpath in search_entries: 
     entries.append(get_elements_by_xpath(driver, xpath)) 

    csv_output.writerows(zip(*entries)) 

: 파이썬의 csv module는 자신의 쉼표를 추가 할 필요없이 쉼표로 구분 된 항목에 자동으로 획득 된 목록을 변환 할 수 있습니다

CompanyName,ContactNumber,Address,AddressInfo,Estd,Ratings 
Bansal Investment & Consult...,+(91)-22-38578062,Manpada-thane West.. | more..,"CA, Tax Consultants, more...",Estd.in 2003,27 Ratings 
G.Kedia & Associates,+(91)-22-38555914,"Station Road, Thane We.. | more..","CA, Company Registration Consultants, more...",Estd.in 2010,17 Ratings 
Tarun Shah & Associates,+(91)-22-38552775,"Mogra Lane, Andheri Ea.. | more..","CA, Income Tax Consultants, more...",Estd.in 2000,12 Ratings 
Hemant Shah And Associates LLP,+(91)-22-38588696,"Azad Road, Andheri Eas.. | more..","CA, Company Secretary, more...",Estd.in 1988,65 Ratings 

루프는 각 xpath를 검색하고 각 검색에 대한 배열 항목을 작성합니다. 각 검색은 일치하는 배열을 반환하므로 항목 배열의 배열로 끝납니다.

그러면 CSV 파일에 기록해야합니다. entries은 열 순서이며 CSV 파일은 행 순서로 작성해야합니다. 이렇게하려면 행 순서로 변환하는 데 zip(*entries)이 사용됩니다. 전체 배열의 순서가 올바르므로 writerows을 한 번 호출하면 전체 파일을 한 번에 쓸 수 있습니다.

파이썬의 CSV 라이브러리를 사용할 때 얻을 수있는 또 다른 이점은 필드에 쉼표가 있으면 필드 주위에 자동으로 따옴표가 추가되어 Excel에서이를 읽지 않아도 다른 열로 해석된다는 것입니다. Excel이로드하고 추측 할 때로드 될 때 기본 셀 유형의 형식을 변경해야 할 것입니다.

관련 문제