2009-10-23 3 views
5

임의의 HTML 페이지에서 텍스트를 추출하려고합니다. 내가 통제 할 수없는 페이지 중 일부는 HTML이나 스크립트를 조작하기가 어렵다. 또한 공유 호스팅 환경에있어 파이썬 lib를 설치할 수는 있지만 서버에 원하는 것을 설치할 수는 없습니다.잘못된 HTML 페이지에서 텍스트를 추출하는 Python 전략

pyparsing 및 html2text.py도 형식이 잘못된 html 페이지에서 작동하지 않는 것 같습니다. BeautifulSoup로 여전히 작동하지 않는 경우

# Try using BeautifulSoup 3.0.7a 
soup = BeautifulSoup.BeautifulSoup(s) 
comments = soup.findAll(text=lambda text:isinstance(text,Comment)) 
[comment.extract() for comment in comments] 
c=soup.findAll('script') 
for i in c: 
    i.extract()  
body = bsoup.body(text=True) 
text = ''.join(body) 
# if BeautifulSoup can't handle it, 
# alter html by trying to find 1st instance of "<body" and replace everything prior to that, with "<html><head></head>" 
# try beautifulsoup again with new html 

, 그때 나는 첫번째 문자보고의 휴리스틱을 사용하여 리조트, 마지막 문자 :

예 URL은 http://apnews.myway.com/article/20091015/D9BB7CGG1.html

내 현재 구현은 다음과 같은 약이다 (코드 라인 # <처럼 보이는지 확인하고 라인의 샘플을 가져 와서 토큰이 영어 단어 또는 숫자인지 확인하십시오. 토큰 중 몇 개만 단어 나 숫자 인 경우, 줄은 코드입니다.

컴퓨터를 사용하여 각 행을 검사 할 수는 있지만 비용이 약간 들었고 교육을해야 할 것입니다. (물론 자상 학습 기계에 대해 많이 알지 못하므로) 물론 작성하십시오.

모든 조언, 도구, 전략이 가장 환영받을 것입니다. 또한 나는 그 코드의 후반부가 다소 혼란 스럽다는 것을 알고 있습니다. 왜냐하면 코드를 포함하고있는 라인이 생기면 라인에 실제 영어 텍스트가 약간 있더라도 현재 전체 라인을 버리게됩니다.

+0

글쎄, 솔루션 내구성, 당신이 링크 된 뉴스 기사는 훌륭한 읽을 거리였습니다. 어떤 사람들? :) –

+1

@ 레시, 나는 또한 형식이 잘못된 사람들이라고 생각합니다. – Johnny4000

답변

5

은 웃음을하지 않으려 고하지만, :

class TextFormatter: 
    def __init__(self,lynx='/usr/bin/lynx'): 
     self.lynx = lynx 

    def html2text(self, unicode_html_source): 
     "Expects unicode; returns unicode" 
     return Popen([self.lynx, 
         '-assume-charset=UTF-8', 
         '-display-charset=UTF-8', 
         '-dump', 
         '-stdin'], 
         stdin=PIPE, 
         stdout=PIPE).communicate(input=unicode_html_source.encode('utf-8'))[0].decode('utf-8') 

난 당신이 살쾡이있어 희망!

+0

나는 lynx =가 없다. (그리고 그들은 설치하지 않을 것이다. 그들이 나에게 말한 것과 비슷한 ELinks가 설치되어있다. 만약 작동된다면 ELinks 문서를 보면 알 수있다. less – Johnny4000

+0

ELinks and Lynx kick butt. 그들에 대해 알려 주셔서 고마워요. – Johnny4000

+0

그것은 내 편이 몹시 괴롭다. 나는 말할 수있다. 나는 너에게 유용하다고 다행이야! –

0

글쎄, 솔루션이 얼마나 좋은지에 달려 있습니다. 비슷한 웹 사이트에 수백 개의 오래된 HTML 페이지를 가져 오는 비슷한 문제가있었습니다. 나는 기본적으로

# remove all that crap around the body and let BS fix the tags 
newhtml = "<html><body>%s</body></html>" % (
    u''.join(unicode(tag) for tag in BeautifulSoup(oldhtml).body.contents)) 
# use html2text to turn it into text 
text = html2text(newhtml) 

를하고 그것을 밖으로 일하지만, 물론 문서도 BS가 많이 회수 할 수없는 너무 나쁜 될 수 있습니다.

0

잘못된 HTML은 BeautifulSoup이 좋지 않습니다. regex-fu는 어떨까요?

>>> import re 
>>> 
>>> html = """<p>This is paragraph with a bunch of lines 
... from a news story.</p>""" 
>>> 
>>> pattern = re.compile('(?<=p>).+(?=</p)', re.DOTALL) 
>>> pattern.search(html).group() 
'This is paragraph with a bunch of lines\nfrom a news story.' 

그런 다음 정보를 추출 할 유효한 태그 목록을 조합 할 수 있습니다.

관련 문제