2010-05-27 4 views
12

나는 그것을 몇 가지 input.html을 줄 수있는Readability.js와 같은 Python을위한 것이 있습니까?

http://lab.arc90.com/experiments/readability

http://lab.arc90.com/experiments/readability/js/readability.js

그래서 약 Arc90의 readability.js의 파이썬 동등 등 패키지/모듈/기능을 찾고 있어요 그 결과는 해당 HTML 페이지의 "메인 텍스트"의 버전을 정리합니다. 나는 이것을 브라우저 측에서만 동작하는 JS 버전과 달리 서버 측에서 사용할 수 있기를 바란다.

아이디어가 있으십니까?

추신 : 저는 Rhino + env.js를 시도해 보았습니다.하지만 성능은 받아 들일 수없는 것이 었습니다. 대부분의 html 콘텐츠를 정리하는 데 수분이 걸렸습니다. ((여전히 왜 그렇게 큰 성능 차이가 있는지 찾을 수 없었습니다.).

답변

9

시도하십시오 내 포크 https://github.com/buriy/python-readability :

것은 여기 픽처 인 픽처 - 설치 가능한 모듈로 번들로했다.

+0

감사합니다. 답변이 업데이트되었습니다. –

0

왜 대신 코뿔소의 구글 V8/Node.js를를 사용하지? 그것은 수용 가능한 빨리해야한다.

+0

브라우저 환경과 비슷하게 env.js가 V8/Node.js에서 실행됩니까? –

+0

바로 http://flockfeeds.com/입니다. –

-3

을 나는 BeautifulSoup는 파이썬에 가장 적합한 HTML 파서라고 생각합니다. 그러나 당신은 여전히 ​​알아낼 필요가 무엇 사이트의 "주요"부분은.

단일 도메인 만 구문 분석하는 경우 상당히 간단하지만 f 의 패턴을 삽입하면 사이트가 쉽지 않습니다.

아마도 readability.js 접근 방식을 파이썬으로 이식 할 수 있습니까?

1

나는 이것에 대해 몇 가지 연구를 해본 결과 파이썬에서 this approach [pdf]을 구현했다. 마지막으로 구현 한 버전은 헤드/스크립트/iframe 요소, 숨겨진 요소 등을 제거하는 것과 같은 알고리즘을 적용하기 전에 정리 작업을 수행했지만 이것이 핵심이었습니다.

여기에는 텍스트 링크 비율이 큰 요소 (예 : 탐색 모음, 메뉴, 광고 등)를 제거하려고 시도하는 "링크 목록"판별 자의 아주 단순한 구현 기능이 있습니다 :

def link_list_discriminator(html, min_links=2, ratio=0.5): 
    """Remove blocks with a high link to text ratio. 

    These are typically navigation elements. 

    Based on an algorithm described in: 
     http://www.psl.cs.columbia.edu/crunch/WWWJ.pdf 

    :param html: ElementTree object. 
    :param min_links: Minimum number of links inside an element 
         before considering a block for deletion. 
    :param ratio: Ratio of link text to all text before an element is considered 
        for deletion. 
    """ 
    def collapse(strings): 
     return u''.join(filter(None, (text.strip() for text in strings))) 

    # FIXME: This doesn't account for top-level text... 
    for el in html.xpath('//*'): 
     anchor_text = el.xpath('.//a//text()') 
     anchor_count = len(anchor_text) 
     anchor_text = collapse(anchor_text) 
     text = collapse(el.xpath('.//text()')) 
     anchors = float(len(anchor_text)) 
     all = float(len(text)) 
     if anchor_count > min_links and all and anchors/all > ratio: 
      el.drop_tree() 

실제로 사용 된 테스트 코퍼스에서는 매우 잘 작동하지만 높은 안정성을 얻으려면 많은 조정이 필요합니다.

4

우리는 방금 repustate.com에서 새로운 자연어 처리 API를 시작했습니다. REST API를 사용하면 HTML 또는 PDF를 지우고 텍스트 부분 만 다시 가져올 수 있습니다. API는 무료이므로 마음껏 사용해보십시오. 그리고 그것은 파이썬으로 구현됩니다. 그것을 확인하고 결과를 readability.js와 비교하십시오. 거의 100 % 동일하다는 것을 알게 될 것입니다.

+0

흠, 유망 해 보인다! ;-) 나는 그것을 시도 할 것이다. 하드 한도가 있습니까?하루에 몇 페이지를 처리 ​​할 수 ​​있습니까? –

+0

와우, 방금 URL을 입력하기 위해 사이트를 사용했고, 기사를 완벽하게 추출했습니다. –

3

hn.pyReadability's blog을 통해 App Engine 앱인 Readable Feeds이이를 사용합니다. 빠르게 최신 자바 스크립트 버전의 모든 기능을 가지고 있습니다 http://github.com/srid/readability

+1

이것은 현재 사용 가능한 것과 비교되는 가독성의 매우 오래된 버전 인 것 같습니다 : 0.4 vs. 1.7.1. 업데이트 할 기회가 있으십니까? –

관련 문제