[기계 학습에 추천 태그 지정 #2.5] 스크래핑 스크립트 수정
6567 단어 파이썬scrapingMachineLearning
<ENGLISH>
Hello - I hope you have a good day. Happy weekend should be happy cording day
Ok, today I will not proceed the scripting and I'd like to modify previous script. The script is below from #2:
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
Yes, it works, but want to use (1) BeautifulSoup instead of regular expression and (2)Hash list instead of counting inside for.
(1) BeautifulSoup
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
Regular Expression is strong tool, but I have to learn BeautifulSoup more. Beautiful Soup is using unique type for it's string, and we can check how to use it in user's guide .
I modified it as below.
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
soup2 = BeautifulSoup(tag.encode('utf8'), "lxml")
print "".join([string.encode('utf8') for string in soup2.strings])
Looks smarter?
you got another soup for getting strings. Which do you like?
(2) Hash List for splitting.
Watch out!
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
To get splitter strings for each web site, used c as count up integer. That's not cool. So I modified as below.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
numHash = {}
for i in range(len(scraper)):
numHash[scraper[i][0]] = i
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
c = numHash[domain[0]]
break
yes, it becomes longer, but I think it's much better than previous, isn't it?
Great, next I hope I can proceed to next step... It will be getting elements for learning.
<일본어>
네, 도우. 주말이네요. 좋은 주말을 맞이하기 위해서도 코딩에 가자.
오늘은 다음 진행하기 전에 #2에서 했던 스크립트를 수정하고 싶습니다. 이쪽이군요.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
이것이라도 움직입니다만···변경점으로서는 (1)태그 제거를 정규 표현이 아니고 BeautifulSoup를 사용하는 것과, (2)단락 문자의 선택에 카운트 업이 아니고, 해시 리스트를 사용한다고 하는 점이 됩니다 합니다.
(1) BeautifulSoup 사용
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
정규 표현은 매우 편리합니다만, 모처럼의 BeautifulSoup 를 보다 유효하게 할 수 없는가라고 생각했던 대로입니다. BS로, 안의 캐릭터 라인의 발출을 위한 툴은 모여있습니다만, 독특한 캐릭터 라인 형식이 있기 때문에, 처음은 딱 어려웠다. 하지만 확실히.
그리고, 변경 후가 이것이다!
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
soup2 = BeautifulSoup(tag.encode('utf8'), "lxml")
print "".join([string.encode('utf8') for string in soup2.strings])
멋지게 느껴지지 않습니까? 수프를 한 번 더 대체하여 태그의 문자열을 끌어내기 위해 변경했습니다.
(2) 구분 기호에 해시리스트 사용
여기.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
C 변수를 카운트 업하여 구분 기호의 번호를 조정하는 모양. 음, 어쩐지? 그래서 멋지게 대변신.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
numHash = {}
for i in range(len(scraper)):
numHash[scraper[i][0]] = i
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
c = numHash[domain[0]]
break
예상과는 달리 스크립트가 길어졌습니다. 그렇지만 이쪽이 매우 좋아합니다. 좀 더 깨끗하게 할 수 있을까.
그래서 이번에는 자기 만족스러운 수정을 풀었습니다. 다음 번은 다음에 진행할까라고 생각합니다. 학습의 기초가 되는 링크와 태그 리스트의 스크래핑입니다. 언제 머신러닝을 받을까요? . . 슬슬 사기라고 할 것 같다.
Reference
이 문제에 관하여([기계 학습에 추천 태그 지정 #2.5] 스크래핑 스크립트 수정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Bython-Chogo/items/2e2e508b91928e5cd9d5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)