2017-08-07 10 views
1
import requests 
from bs4 import BeautifulSoup 
import re 

source_url = requests.get('http://www.nytimes.com/pages/business/index.html') 
div_classes = {'class' :['ledeStory' , 'story']} 
title_tags = ['h2','h3','h4','h5','h6'] 

source_text = source_url.text 
soup = BeautifulSoup(source_text, 'html.parser') 


stories = soup.find_all("div", div_classes) 

h = []; h2 = []; h3 = []; h4 =[] 

for x in range(len(stories)): 

    for x2 in range(len(title_tags)): 
     hold = []; hold2 = [] 
     hold = stories[x].find(title_tags[x2]) 

     if hold is not None: 
      hold2 = hold.find('a') 

      if hold2 is not None: 
       hh = (((hold.text.strip('a'))).strip()) 
       h.append(hh) 
       #h.append(re.sub(r'[^\x00-\x7f]',r'', ((hold.text.strip('a'))).strip())) 
       #h2.append(hold2.get('href')) 

    hold = [] 
    hold = stories[x].find('p') 

    if hold is not None: 
     h3.append(re.sub(r'[^\x00-\x7f]',r'',((hold.text.strip('p')).strip()))) 

    else: 
     h3.append('None') 


h4.append(h) 
h4.append(h2) 
h4.append(h3) 
print(h4) 

皆さん。私はいくつかのデータを削りたいと思っていましたが、印刷出力が( ')を(â\ x80 \ x99)に置き換えていたことに気づいたときに、スクレーパーをほぼ完成させました。たとえば、「China's」を含むタイトルが「Chinaâ\ x80 \ x99s」に出ていました。私はいくつかの研究を行い、無駄のないデコード/エンコード(utf-8)を使用しようとしました。 str()でデコードを実行することはできません。私はre.subを使ってみましたが、私はそれを( '\ x80 \ x99)に置き換えることはできませんでしたが、私はそれを(')に置き換えませんでした。私は自然言語処理を使ってデータを解釈したいので、アポストロフィ大きく意味を変えようとしている。ヘルプは大いに感謝されます、私はこの1つのブロックをヒットしたような気がします。アポストロフィはâ x80 x99として印刷されています。

答えて

1

ISO 8859-1および関連するコードセット(多くのものがあります)では、âはコードポイント0xE2を持っています。 UTF-8エンコーディングとして0xE2,0x80,0x99の3バイトを解釈すると、文字はU + 2019、右引用符(「」または「'とは異なります。差を見極める)。

私はあなたの難しさの源のためのいくつかの可能性を参照してください、のいずれか1つ以上が、あなたの悩みの原因が考えられます。

  1. あなたの端末がUTF-8を解釈するように設定されていません。
  2. ソースコードは'(U + 0027、APOSTROPHE)を使用する必要があります。
  3. Python 3.xではなくPython 2.xを使用しており、Unicode(UTF-8)を使用しているため問題が発生しています。これに対して(Cory Maddenpointed out)、コードはprint(h4)で終わっています。これはPython 3であるため、おそらく問題ではありません。

引用符をASCIIアポストロフィに変更するのが最も簡単な場合があります。

一方、HTMLを他の場所から分析している場合は、スクリプトがUTF-8をどのように処理するかを考慮する必要があります。 Unicode U + 20xxの範囲の引用符を使用することは非常に一般的な選択です。多分あなたのスクレーパーはそれを処理する必要がありますか?

+0

コード例の最後の行は、Python 3.xを意味します。 –

+1

@CoryMadden:はい、そうです。したがって、オプション3はおそらく関連性がありません。 –

+1

これらの基準のすべてが問題であったため、誤解しています。 –

関連する問題