BeautifulSoup을 사용한 Python 웹 스크래핑
저는 파이썬에 비교적 익숙하지 않아서 과제를 위해 BeautifulSoup으로 웹 페이지를 가져 와서 모든 단락을 추출하고 "ing"으로 끝나는 모든 단어를 추출하는 프로그램을 작성해야했습니다. "단어"+ 탭 + "단어 수"+ "개행"형식.
이것은 지금까지 내 코드입니다. 이것을 처리하는 더 비단뱀적인 방법이 있습니까? 아니면 일반적으로 코드를 개선하는 방법?
from bs4 import BeautifulSoup
import requests
import re
def main():
site = "https://en.wikipedia.org/wiki/Data_science"
r = requests.get(site).content
soup = BeautifulSoup(r)
ps = soup.findAll('p')
fulltext = ''
for p in ps:
fulltext += p.get_text()
words = match_words(fulltext)
formated_words = sort_and_format(words)
with open(r"Q1_Part1.txt","w") as file:
file.write(formated_words)
def match_words(string):
pattern = re.compile(r'\b(\w*ing)\b')
words = re.findall(pattern, string.lower())
matching_words = {}
for word in words:
if word in matching_words:
matching_words[word] += 1
else:
matching_words[word] = 1
return matching_words
def sort_and_format(dict):
ordered_keys = sorted(dict, key=dict.get, reverse=True)
output_string = ''
for r in ordered_keys:
output_string += f"{r}\t{dict[r]}\n"
return output_string
main()
답변
if word in matching_words:
matching_words[word] += 1
else:
matching_words[word] = 1
추가하기 전에 사전에 키가 있는지 확인하는 경우 a defaultdict가 더 나은 옵션 일 수 있습니다.
from collections import defaultdict
matching_words = defaultdict(int)
matching_words[word] += 1
int0인수없이 호출 될 때를 반환 0하고 키가 존재하지 않을 때 사전의 기본값으로 사용됩니다.
fulltext = ''
for p in ps:
fulltext += p.get_text()
이것은 매우 효율적이지 않습니다. +=문자열 에 대한 성능은 이후 버전의 Python에서 향상되었지만 여전히 일반적으로 느립니다. 일반적인 대안은 다음을 사용하는 것입니다 join.
pieces = [p.get_text() for p in ps]
fulltext = "".join(pieces)
# Or just
fulltext = "".join([p.get_text() for p in ps])
그런 다음 유사하게 sort_and_format:
output_string = "".join([f"{r}\t{dict[r]}\n"] for r in ordered_keys])
에서는 sort_and_format매개 변수의 이름을 dict. 이것은 다음과 같은 몇 가지 이유로 차선책입니다.
dict데이터를 제대로 설명하지 않는 일반적인 이름입니다.dict은 내장 클래스의 이름이며, 섀도 잉하면 코드가 더 혼란스러워지고 내장 클래스를 사용할 수 없게됩니다.
유형을 표시하는 것이 도움이 될 수 있으므로 여기에 유형 힌트를 소개하겠습니다.
from typing import Dict
def sort_and_format(words: Dict[str, int]) -> str:
. . .
이것은 함수 가 s에 대한 Dict이온 매핑을 받아들이고 ing을 반환 한다는 것을 말합니다.strintstr
또한의 sort_and_format경우 and이름을 고수 하기 시작 하면 함수가 너무 많이 수행하고 있음을 알 수 있습니다. 정렬과 서식이 개별적으로 발생하면 코드가 더 의미가 있음을 알 수 있습니다. 이 함수는 순전히 서식을 처리 할 수 있으며 대신 사용할 시퀀스를 전달할 수 있습니다. 그 시퀀스가 정렬되어 있다면 훌륭하지만 그렇지 않다면 역시 훌륭합니다. 정렬 순서가 무엇인지 서식을 지정하는 것은 중요하지 않습니다.