2016-08-24 11 views
1

現在、LinkedInデータをスクレイプするためにSelenium Pythonを使用しています。さまざまなWebページを解析してデータをスクラップできますが、Unicodeエラーのために最初の数ページ後にプロセスが中断されます。UnicodeEncodeError: 'ascii'コーデックは448位の文字 'u2013'をエンコードできません:序数が範囲内にありません(128)

from selenium import webdriver 
from time import sleep 

driver = webdriver.Firefox() 
driver.get('https://www.linkedin.com/jobs/search?locationId=sg%3A0&f_TP=1%2C2&orig=FCTD&trk=jobs_jserp_posted_one_week') 

result = [] 
while True: 
    while True: 
     try: 
      sleep(1) 
      result +=[i.text for i in driver.find_elements_by_class_name('job-title-text')] 
     except: 
      sleep(5) 
     else: 
      break 
    try: 
     for i in range(50): 
      nextbutton = driver.find_element_by_class_name('next-btn') 
      nextbutton.click() 
    except: 
     break 

with open('jobtitles.csv', 'w') as f: 
f.write('\n'.join(i for i in result).encode('utf-8').decode('utf-8')) 
+1

を交換する前処理にあなたのコードが必要になる場合があります。( 'UTF-8')'デコード? 'Actual String' - >' Encode' - > 'Decode' - >' Actual String'、使用法は? –

+0

私は仕事のタイトルのテキスト形式を取得し、CSVファイルにエクスポートしたい –

+0

デコードを取り除こうとしましたが、それはまだ9番目のWebページまで動作し、停止します。実際には50ページあります –

答えて

0

あなたはUnicodeWriterを使用することができます(Pythonのドキュメントからの):ここに私のコードです

import codecs 
import cStringIO 
import csv 
from time import sleep 

from selenium import webdriver 


class UnicodeWriter: 
    """ 
    A CSV writer which will write rows to CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     # Redirect output to a queue 
     self.queue = cStringIO.StringIO() 
     self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
     self.stream = f 
     self.encoder = codecs.getincrementalencoder(encoding)() 

    def writerow(self, row): 
     self.writer.writerow([s.encode("utf-8") for s in row]) 
     # Fetch UTF-8 output from the queue ... 
     data = self.queue.getvalue() 
     data = data.decode("utf-8") 
     # ... and reencode it into the target encoding 
     data = self.encoder.encode(data) 
     # write to the target stream 
     self.stream.write(data) 
     # empty queue 
     self.queue.truncate(0) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 


driver = webdriver.Firefox() 
driver.get('https://www.linkedin.com/jobs/search?locationId=sg%3A0&f_TP=1%2C2&orig=FCTD&trk=jobs_jserp_posted_one_week') 

result = [] 
while True: 
    while True: 
     try: 
      sleep(1) 
      result +=[i.text for i in driver.find_elements_by_class_name('job-title-text')] 
     except: 
      sleep(5) 
     else: 
      break 
    try: 
     for i in range(50): 
      nextbutton = driver.find_element_by_class_name('next-btn') 
      nextbutton.click() 
    except: 
     break 


with open('jobtitles.csv', 'w') as f: 
    doc = UnicodeWriter(f) 
    doc.writerows(result) 
0

不適切なエンコーディング...あなたはバイトストリームは、UTF-8でエンコードされ、それがあると主張していますそうでない場合UTF-8実装では参照位置にASCII文字(0-127)しか許されないので、UTF-8デコードは失敗します...あなたのコードでUTF-8デコード失敗したので、自分で正確な場所をトレースする必要があります。 変数をtype()でチェックしてください。また、Python 2と3には違いがありますエリア

0
import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 
print sys.getdefaultencoding() 

コードの上に追加します。

また、uがなぜあなたは `( 'UTF-8').encodeを行っているいくつかのnonenglish言葉

 words=word_tokenize(content) 
     # print words 
     word=[] 
     for w in words: 
      w= re.sub(r'[^\w\s]', '',w) 
      w =re.sub("[^A-Za-z]+"," ",w,flags=re.MULTILINE) 
      w =w .strip("\t\n\r") 
      word.append(w) 
     words=word 
     # print words 
     stop_words = set(stopwords.words('english')) 
     filteredword = [w for w in words if not w in stop_words and 3 < len(w)] 
     # print filteredword 
     words=" ".join(filteredword) 
関連する問題