1

現在Pythons BeautifulSoup Libraryを使って新聞記事のWebページをクロールしています。これらの記事は、オブジェクトの「詳細」に格納されます。Python:別の配列のテキストからの部分文字列を持つ配列の文字列の一致

次に、オブジェクト「行」に格納されているさまざまな通りの名前がいくつかあります。今私は記事に "行"に含まれている通りの名前を検索したいと思います。

ストリート名の1つが記事の一部である場合は、ストリートの名前を配列で安全にしたいと思います。

記事に一致するものがない場合(選択した記事にストリート名が含まれていない場合)、配列に空の要素が含まれているはずです。

たとえば、オブジェクト "行"が "Abbey Road"、 "St-John's Bridge"、 "West Lane"、 "Sunpoint"、 "East End"からなるとします。

オブジェクト「詳細」は、「Abbey Road」と「West Lane」を含む4つの記事で構成されます(たとえば、「Abbey Roadの自動車事故、3人が傷ついている」など)。他の2つの記事には「行」の名前は含まれていません。

が、結果はこのような配列である必要があり、一致した後: [] [「アビーロード」] [] [「ウェスト・レーン」]

私も私の元として、このためにベクトル化を使用するように言われましたデータサンプルはかなり大きいです。しかし、私は文字列演算にベクトル化を使用することに慣れていません。誰もこれですでに働いていますか?

マイコードは現在、次のようになりますが、このリターンだけ「-1」私の結果の配列の要素として:誰かが私の実験を再現したい場合

from bs4 import BeautifulSoup 
import requests 
import io 
import re 
import string 
import numpy as np 


my_list = [] 
for y in range (0, 2): 
    y *= 27 
    i = str(y) 
    my_list.append('http://www.presseportal.de/blaulicht/suche.htx?q=' + 'einbruch' + '&start=' + i) 



for link in my_list: 
    # print (link) 
    r = requests.get(link) 
    r.encoding = 'utf-8' 
    soup = BeautifulSoup(r.content, 'html.parser') 



with open('a4.txt', encoding='utf8') as f: 
     lines = f.readlines() 
     lines = [w.replace('\n', '') for w in lines]  


     details = soup.find_all(class_='news-bodycopy') 
     for class_element in details: 
      details = class_element.get_text() 

     sdetails = ''.join(details) 
     slines = ''.join(lines) 
     i = str.find(sdetails, slines[1 : 38506]) 
     print(i)     

、ウェブサイト、URLは上記のコードでありますオブジェクト「詳細」内の記事のクロールと格納が適切に機能するので、コードをコピーすることができます。

「ライン」のオブジェクトのための私の元のデータのための.txtファイルは、このDropboxのフォルダにアクセスすることができます。 https://www.dropbox.com/s/o0cjk1o2ej8nogq/a4.txt?dl=0

おかげで任意のヒントのために多くのことを私はベクトル化を経て、好ましくは、この作業を行うことができる方法。

+0

私は変数 'soup'は、各イテレーションで上書きされます2番目のforループについてはかなりわからないと思います。とにかく、コード全体を実行して問題を理解しようとします! –

+0

2番目のforループは、ニュースレポートが保存されているウェブサイトの異なるページをクロールするためのものです。リンクのリストを作成します。それぞれのリンクは1ページ分であり、最初のforループとページングのカウンタはURLの27です。 しかし、記事から「a4.txt」のリストと一致させてストリート名を抽出し、ストリート名が一致しない要素が空で、一致する名前を持つ要素が一致する要素を配列に格納するのは苦労しています名前のみ。 私のコード全体が上記のポストにあり、 "a4.txt"のリンクがあります。 @VivekHarikrishnan – DataFreshman

答えて

0

あなたはこのような何かを試みることができる:

my_list = [] 
for y in range (0, 2): 
    i = str(y) 
    my_list.append('http://www.presseportal.de/blaulicht/suche.htx?q=einbruch&start=' + i) 

for link in my_list: 
    r = requests.get(link) 
    soup = BeautifulSoup(r.content.decode('utf-8','ignore'), 'html.parser') 

details = soup.find_all(class_='news-bodycopy') 
f = open('a4.txt') 
lines = [line.rstrip('\r\n') for line in f] 

result = [] 
for i in range(len(details)): 
    found_in_line = 0 
    for j in range(len(lines)): 
     try: 
      if details[i].get_text().index(lines[j].decode('utf-8','ignore')) is not None: 
       result.append(lines[j]) 
       found_in_line = found_in_line + 1 
     except: 
      if (j == len(lines)-1) and (found_in_line == 0): 
       result.append(" ") 
print result 
+0

何らかの理由で、ウェブサイトからクロールされた記事やストリート名を含む.txtファイルでは機能しません。 しかし、これは例を解決します。たぶん、私はそれを私の特定の設定のために働きかけることができます。いずれにしても、あなたの提案に感謝します。@Gunnar Sigfusson – DataFreshman

+0

おかげさまで、私は週末にこれを詳しく見ていきます。上のコードはスープのものともうまくいくはずですが、私はいくつかのエンコーディングに関連する問題(habe Erfahrung mit deutschen Buchstaben :)を見ています)例外。私はまた、パフォーマンスに関する予想される空の結果に取り組むためにキャッチしようとするよりも優れたものを見つけようとします。 –

+0

@DataFreshmanご迷惑をおかけして申し訳ありませんが、私はあなたの(変更された)データで何らかの形で動作するコードで元の回答を更新しました。主な問題は、データのエンコード/デコードが間違っていることです。最初はウェブページのデータであり、a4.txtファイルには多くの不具合があります。 a4.txtファイルをUTF8で正しくエンコードするように更新するか、歪んだ場所に正しいドイツ語の文字を書き込む必要があります(これはドイツのローカル設定で動作します)。私は後者をやった、私はまた、C、D、E、F、G、Xなどのような多くの単一の文字を削除しました –

関連する問題