[기계 학습에 추천 태그 지정 #2.5] 스크래핑 스크립트 수정

<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

예상과는 달리 스크립트가 길어졌습니다. 그렇지만 이쪽이 매우 좋아합니다. 좀 더 깨끗하게 할 수 있을까.

그래서 이번에는 자기 만족스러운 수정을 풀었습니다. 다음 번은 다음에 진행할까라고 생각합니다. 학습의 기초가 되는 링크와 태그 리스트의 스크래핑입니다. 언제 머신러닝을 받을까요? . . 슬슬 사기라고 할 것 같다.

좋은 웹페이지 즐겨찾기