2016-12-01 24 views
0

これはよくある質問ですが、該当する回答が見つかりませんでした。私は以前の関数でHTMLページをスクラップした単語のリストから句読点を削除しようとしています。ここで私が持っているものです。Pythonのリストから句読点を削除する

import re 
def strip_text():  
     list_words = get_text().split() 
     print(list_words) 
     for i in range(len(list_words)): 
      list_words = re.sub("[^a-zA-Z]"," ",list_words) 
      list_words = list_words.lower() 
     return list_words 
    print(get_text()) 
    print(strip_text()) 

私はre.subビットが列ではなく、リストに使用されることを想定しているので、これは動作しないことを実現します。これを行うには同様に効率的な方法がありますか?私は単語のリストを再び文字列にする必要がありますか?

編集:この問題は、私が言ったようにHTMLページからテキストを削っていることです。

from bs4 import BeautifulSoup 
import requests 
from collections import Counter 
import re 
tokens = [] 
types= Counter(tokens) 
#str_book = "" 
str_lines = "" 
import string 

def get_text(): 
    # str_lines = "" 
    url = 'http://www.gutenberg.org/files/1155/1155-h/1155-h.htm' 
    r = requests.get(url) 
    data = r.text 
    soup = BeautifulSoup(data, 'html.parser') 
    text = soup.find_all('p') #finds all of the text between <p> 
    i=0 
    for p in text: 
     i+=1 
     line = p.get_text() 
     if (i<10): 
      continue 
     print(line) 
    return line 

だから、単語のリストは、私が使用しているアガサ・クリスティブック内のすべての単語のリストを次のようになります。私は上記の持っているものの前のコードは次のようになります。うまくいけば助けてくれます。

+0

これはあなたの質問に直接答えませんが、私はBeautiful Soupパッケージがウェブスクレイピングに関連する多くの活動を処理していることを指摘したかったので、今自分の関数を書いているならば、 – HFBrowning

+1

を調べる価値があります。ええ、私は私のget_text関数でBeautifulSoupを使用しています!間違いなくその部分をトンに簡単にします。 – Alanan

+1

'インポート文字列; list_words = [s_ranslate(None、string.punctuation)for list_words] '、[this](http:// stackoverflow。com/a/266162/6779606)回答。 – PyNoob

答えて

3

regexはまったく必要ありません。 string.punctuationにはすべての句読点が含まれています。ちょうど繰り返すとそれらをスキップします。

get_text()を見てみると
>>> import string 
>>> ["".join(j for j in i if j not in string.punctuation) for i in lst] 
+0

私はforループの代わりにこれを試しました(少し修正しましたので、最初はlist_wordsなどでした)が、それでもすべての句読点付きのテキストが返されます。うーん。 – Alanan

+0

あなたの言葉の一覧がどのように見えるか教えていただけますか? –

+0

@ Alanan、 'get_text()'のループ内のprint文のためにそのように見えますか?最後の行が現れ、 'get_text()'によって返された行は空白になり、 'strip_text()'は何もせず空のリストを返します。 – PyNoob

1

、我々が我々が句読点を削除することができます前に、いくつかのことを変更する必要が表示されます。私はここにいくつかのコメントを追加しました。

def get_text(): 
    str_lines = [] # create an empty list 
    url = 'http://www.gutenberg.org/files/1155/1155-h/1155-h.htm' 
    r = requests.get(url) 
    data = r.text 
    soup = BeautifulSoup(data, 'html.parser') 
    text = soup.find_all('p') #finds all of the text between <p> 
    i=0 
    for p in text: 
     i+=1 
     line = p.get_text() 
     if (i<10): 
      continue 
     str_lines.append(line) # append the current line to the list 
    return str_lines # return the list of lines 

最初に、str_lines変数のコメントを外して空のリストに設定しました。次に、printステートメントをコードに置き換えて、行を行のリストに追加します。最後に、returnステートメントを変更して、その行のリストを返しました。

strip_text()ために、我々は数行のコードにそれを減らすことができます。私たちは全体のラインを見て、すべての句読点を削除することができますのでごとの単語に基づいて動作する必要はありません

def strip_text():  
    list_words = get_text() 
    list_words = [re.sub("[^a-zA-Z]", " ", s.lower()) for s in list_words] 
    return list_words 

、そこでsplit()を削除しました。リストの理解を使用して、リストのすべての要素を1行で変更することができます。また、コードを圧縮するためにlower()メソッドをそこに配置します。 @AhsanulHaqueが提供する答えを実装するために

、あなただけの示すように、それにstrip_text()方法の、第2行を置換する必要があります:楽しみのために

def strip_text(): 
    list_words = get_text() 
    list_words = ["".join(j.lower() for j in i if j not in string.punctuation) 
        for i in list_words] 
    return list_words 

、ここでそのtranslate方法があるI hereが説明したように述べた以前の、Pythonの3.xのために実装:

def strip_text(): 
    list_words = get_text() 
    translator = str.maketrans({key: None for key in string.punctuation}) 
    list_words = [s.lower().translate(translator) for s in list_words] 
    return list_words 

残念ながら私は時間これらのfのいずれかをすることはできませんグーテンベルクが一時的に私をブロックしてしまったので(コードのランがあまりにも速すぎる、と思います)

+0

うわー - これはとても信じられないほど役に立ちました!なんらかの理由で\ n、カンマ、アポストロフィ、引用符がテキストに残っていますが、それらを強制的に強制することもできます。それ以上のヒントがある場合は、歓迎しますが、そうでなければ、あなたの時間/労力とあなたの長い説明に本当に助けてくれてありがとう。 – Alanan

+1

btw、 'string.punctuations'には' '! '#$%&\'()* +、 - 。/ :; <=>?@ [\\]^_ \' {|}〜 ''が含まれています。無視する必要があります。 –

関連する問題