2016-11-27 4 views
0

私はこのウェブページをoed.comでスクレープするたびに、ユニコード文字のように見える小さなアポストロフィを取得します。私のコードをフィルタリングして、それらの文字すべてを通常のアポストロフィで置き換えるにはどうすればよいですか?以下は私の単語のリストを印刷するために使用したコードです(あなたがサイトにサインインしていない場合は、複数回スクレイプすると繰り返し単語が表示されます)。Pythonでウェブスクラップする際にユニコード文字をフィルタリングする方法は?

import csv 
import os 
import re 
import requests 
import urllib2 

year_start= 1550 
year_end = 1560 
subject_search = ['Law'] 

with open("/Applications/Python 3.5/Economic/OED_table.csv", 'a') as outputw, open("/Applications/Python 3.5/Economic/OED.html", 'a') as outputh: #opens the folder and 'a' adds the words to the csv file.  
for year in range(year_start, year_end +1): 
    path = '/Applications/Python 3.5/Economic' 
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) 
    urllib2.install_opener(opener) 

    user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
    header = {'User-Agent':user_agent} 

    resultPath = os.path.join(path, 'OED_table.csv') 
    htmlPath = os.path.join(path, 'OED.html') 
    request = urllib2.Request('http://www.oed.com/search?browseType=sortAlpha&case-insensitive=true&dateFilter='+ str(year)+ '&nearDistance=1&ordered=false&page=1&pageSize=100&scope=ENTRY&sort=entry&subjectClass='+ str(subject_search)+ '&type=dictionarysearch', None, header) 
    page = opener.open(request) 

    urlpage = page.read() 
    outputh.write(urlpage) 

    new_words = re.findall(r'<span class=\"hwSect\"><span class=\"hw\">(.*?)</span>', urlpage) 
    print new_words 
    csv_writer = csv.writer(outputw) 
    if csv_writer.writerow([year] + new_words): 
     csv_writer.writerow([year, word]) 

これが私の言葉を印刷した後、私はしばしばユニコード文字\ xcb \ x88を取得します。たとえば、un'ententという語は 'un ​​\ xcb \ x88sentenced'と表示します。

これらのユニコード文字のすべてのインスタンスを取得し、適切なアポストロフィで置き換えるにはどうすればよいですか '。私はそれがこのようなものになると思っていた。

for word in new_words: 
    word = re.sub('[\x00-\x7f]','', word) 

私は立ち往生している。

+0

これらの文字を削除するか、またはUnicodeとして正しく解釈しますか? https://docs.python.org/2/howto/unicode.htmlをご覧ください。可能であれば、私はUnicodeを扱うのにはるかに優れているPython 3に切り替えることをお勧めします。 – amyrit

+0

@amyrit、基本的に文字を削除し、単純なキーボードのアポストロフィー文字で置き換えたい> ' – Kainesplain

+0

'word.replace(' xcb \ x88 '、"' ")'を試しましたか?これはあなたの問題の一部を解決するだけですが、私はあなたにユニコードを適切に扱うことを勧めます。それが実際のコーディングであれば、それを避けることはできません。 – amyrit

答えて

0

これについて:これが私の言葉を印刷した後、私はしばしばユニコード文字\ xcb \ x88を得ます。たとえば、un'ententという語は 'un ​​\ xcb \ x88sentenced'と表示します。

問題1:\ xcb \ x88は、ユニコード文字(複数)ではありません。 UTF-8でエンコードされたのは1文字U + 02C8 MODIFIER CHARACTER VERTICAL LINEです。 Unicode標準は、次の文字を変更することを示唆しています。

問題2:un'ententは単語ではありません。

このガジェットが元のデータの意味を確認する必要があります。 私は、それはアポストロフィのようなものではないということです。だからおそらくそれを削除する必要があります。

強くお勧めします。遭遇したすべての非ASCII文字を削除しないでください。また、あなたのファイルを読んで、ファイル全体をUTF-8からユニコードにデコードし、ユニコードを処理し、最後に出力データをエンコードします... UTF-8バイトを処理しようとしません。

関連する問題