2016-12-01 1 views
0

나는 이것이 일반적인 질문 인 것을 알고 있지만 해당 답변을 찾지 못했습니다. 이전 함수에서 HTML 페이지를 스크랩 한 단어 목록에서 구두점을 제거하려고합니다.파이썬 목록에서 구두점 제거하기

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 Sup 패키지가 웹 스크래핑과 관련된 많은 활동을 처리하고 있음을 지적하고자합니다. 따라서 현재 자신의 기능을 작성하고 있다면 – HFBrowning

+1

을 살펴볼 가치가 있습니다. 감사합니다. 예, 내 get_text 함수에서 BeautifulSoup를 사용합니다! 확실히 그 부분을 더 쉽게 만듭니다. – Alanan

+1

'수입 문자열; list_words = [list_words의 s에 대한 s.translate (없음, string.punctuation)], [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()을 삭제했습니다. 목록 이해력을 사용하여 목록의 모든 요소를 ​​한 줄로 바꿀 수 있으며 코드를 압축하기 위해 lower() 메서드를 거기에 추가합니다.

그림과 같이 그냥, 그와 strip_text() 방법의 두 번째 라인을 대체 할 필요가 @AhsanulHaque에서 제공하는 답을 구현하는 방법은 다음과 같습니다

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 설명 된대로 이전, 파이썬 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

와우 - 이것은 매우 도움이되었다! 어떤 이유로 \ r, \ n, 쉼표, 아포스트로피 및 따옴표는 텍스트에 그대로 남아 있지만, 나는 그들을 무차별 적으로 강제 할 수 있습니다. 팁이 더 있으면 환영하지만, 그렇지 않으면 시간과 노력 그리고 당신의 긴 설명에 정말 감사드립니다. – Alanan

+1

btw,'string.punctuations'는''! "# $ % & \ '() * +, -./:; <=>? @ [\\]^_ \'{|} ~''를 포함합니다. 무시해야합니다. –

관련 문제