Exemplo n.º 1
0
 def test_no_body_returned(self):
     data = """<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Sara J Chipps, software blog</title><meta content="development, software, JavaScript" name="keywords"/><meta content="Sara J Chipps' blog about software development" name="description"/><meta content="text/html; charset=us-ascii" http-equiv="content-type"/></head><frameset rows="100%"><frame frameborder="0" noresize="noresize" src="http://www.sarajchipps.com/2010/07/your-code-sucks.html" title="Sara J Chipps, software blog"/></frameset></html>"""
     enml = html2enml(data)
     self.assertEquals(enml, '<div></div>')
Exemplo n.º 2
0
 def test_html_with_body(self):
     data = """<body onload=\"brython({debug:1, cache:'none'})\">\n<center>\n\n<\/center>\n<div><img src=\"http:\/\/brython.info\/brython.png\"><\/img><br><\/br><b>browser python<\/b><\/div>\n\n\n\n<div><p style=\"display:inline;\">\nWithout a doubt, you've seen a clock like this in demos of HTML5\n<\/p><p><canvas height=\"250\" id=\"clock\" width=\"250\">\n<i>sorry, Brython can't make the demo work on your browser ; <br><\/br>check if Javascript is turned on\n<br><\/br><\/i><\/canvas><\/p><p>\nHowever, right click and view the source of this page...\n<\/p><p>It is not Javascript code! Intead, you will find Python code in a script of type \"text\/python\"\n<\/p><p>Brython is designed to replace Javascript as the scripting language for the Web. As such, it is a Python 3 implementation (you can take it for a test drive through a web <a href=\"http:\/\/brython.info\/tests\/console_en.html\">console<\/a>), adapted to the HTML5 environment, that is to say with an interface to the DOM objects and events\n<\/p><p>The <a href=\"http:\/\/brython.info\/gallery\/gallery_en.html\">gallery<\/a> highlights a few of the possibilities, from creating simple document elements to drag and drop and 3D navigation\n<\/p><\/div>\n\n\n<\/body>"""
     html2enml(data)
Exemplo n.º 3
0
 def test_html_without_body(self):
     data = """<div><h2>Introduction<\/h2><p>Conditional random field는 (CRF) 레이블의 인접성에 대한 정보를 바탕으로 레이블을 추측하는 기계학습 기법이다.\nCRF를 활용하여 여러 가지 재미있는 것들을 할 수 있는데, 이를 활용하는 방법에 대해 이야기하겠다. <a href=\"http:\/\/blog.shurain.net\/2013\/04\/crf.html\"><span id=\"ref1\">[1]<\/span><\/a><\/p><p>하지만 그래도 CRF가 어떤 식으로 동작하는 지 대충은 알아야 하니 대략적인 설명을 해보도록 하자.\n보통 품사 태깅을 (Part-of-speech tagging) 예로 많이 드니, 이를 예로 들도록 하겠다. <a href=\"http:\/\/blog.shurain.net\/2013\/04\/crf.html\"><span id=\"ref2\">[2]<\/span><\/a><\/p><h2>Part-of-Speech Tagging<\/h2><p>다음과 같은 문장이 주어졌다고 가정하자. <\/p><blockquote>\n<p>\"Bob drank coffee at Starbucks\"<\/p>\n<\/blockquote><p>각 단어에 품사를 붙여보면 다음과 같다.<\/p><blockquote>\n<p>\"NOUN VERB NOUN PREPOSITION NOUN\"<\/p>\n<\/blockquote><p>전통적인 supervised learning 기법을 적용한다고 생각해보면 트레이닝 데이터가 있을 것이고\n데이터로부터 의미 있는 특징을 (feature) 뽑아내는 과정이 있을 것이다.<\/p><p>CRF에서는 특징 함수를 (feature function) 정의하여 사용한다.\n특징 함수는 문장과 해당 문장을 구성하는 단어들의 위치 및 레이블 정보를 입력으로 받아서 어떤 실수를 (주로 0, 1) 출력하게 된다. \n각 특징 함수는 개별적인 가중치를 갖는데, 결국 어떤 문장이 주어지면 어떤 레이블이 얼마나 적합한 레이블인지를 weighted feature sum으로 계산하게 된다.<\/p><p>특징 함수의 장점은 임의의 특징을 표현하는 것이 가능하다는 점이다.\n몇 가지 특징 함수의 예를 들어보면 다음과 같다.<\/p><ul>\n<li>만약 i 번 레이블이 ADVERB 이고 \"-ly\"로 해당 단어가 끝나면 1, 아니면 0을 리턴하는 함수<\/li>\n<li>만약 i 번 레이블이 VERB 이고 문장이 물음표로 끝나면 1, 아니면 0을 리턴하는 함수<\/li>\n<li>만약 i-1 번 레이블이 ADJECTIVE이고 i번 레이블이 NOUN이면 1, 아니면 0을 리턴하는 함수<\/li>\n<\/ul><p>보는 바와 같이 특징 함수는 매우 자유로운 형태를 띌 수 있다.\nCRF는 이처럼 자유롭게 특징 함수를 만들고, 각각의 특징 함수에 가중치를 부여하고 그 합을 구해서 사용하게 된다.\n최종적으로 문장이 주어졌을 때, 특정한 레이블이 얼마나 그럴싸한지는 해당 레이블의 점수를 (weighted feature sum) 모든 가능한 레이블의 점수로 나눠주면 된다.<\/p><p>가중치를 어떤 식으로 학습하는지, 다른 종류의 더 복잡한 CRF에 대한 설명은 생략하기로 하고 이런 CRF를 어떻게 다른 용도로 활용하는 것이 가능한지 살펴보자.<\/p><h2>Different Uses<\/h2><p>CRF는 특징 함수를 매우 자유롭게 설정할 수 있기 때문에 다른 유용한 것들을 할 수 있다.\n가령 띄어쓰기가 되어 있지 않은 문장을 자동으로 띄어쓰기 해주는 것이 가능하다.\n어떤 문장이 주어졌을 때, 레이블로 각 문자마다 여기서 띄어쓰기를 해야 하는지 아닌지 정보를 0\/1로 주는 것을 상상할 수 있다.\n가령, <\/p><blockquote>\n<p>CRF로띄어쓰기를해보자<\/p>\n<\/blockquote><p>라는 문장이 주어진 경우, 올바른 형태는<\/p><blockquote>\n<p>CRF로_띄어쓰기를_해보자<\/p>\n<\/blockquote><p>일 것이다. 여기에 레이블을 붙여보면, <\/p><blockquote>\n<p>C\/0 <br><\/br>\nR\/0 <br><\/br>\nF\/0 <br><\/br>\n로\/1 <br><\/br>\n띄\/0 <br><\/br>\n어\/0 <br><\/br>\n쓰\/0 <br><\/br>\n기\/0 <br><\/br>\n를\/1 <br><\/br>\n해\/0 <br><\/br>\n보\/0 <br><\/br>\n자\/1 <br><\/br><\/p>\n<\/blockquote><p>정도로 붙여보는 것이 가능하다.\n이런 식으로 레이블이 붙어 있을 때, 이로부터 유용한 띄어쓰기 정보를 뽑아내는 특징 함수만 만들어 주면 CRF를 사용해서 이를 학습할 수 있다.\n가령 어떤 문자가 나타난 경우 그 앞의 문자와의 관계 등을 특징 함수에 넣어주는 것을 쉽게 상상할 수 있다.\n한국어 위키피디아 등의 데이터를 활용하면 쉽게 트레이닝 데이터를 만들 수 있고, 바로 CRF로 학습을 하면 끝이다. <a href=\"http:\/\/blog.shurain.net\/2013\/04\/crf.html\"><span id=\"ref3\">[3]<\/span><\/a><\/p><p><\/p><p><\/p><p><\/p><\/div>"""
     html2enml(data)
Exemplo n.º 4
0
def main():
    pinboard_db = PinboardDatabase()
    datestr = pinboard_db.last_updated

    pinboard = PinboardSource(PINBOARD_API_TOKEN)
    diffbot = DiffbotTransformer(DIFFBOT_TOKEN)
    evernote = EvernoteSink(EVERNOTE_DEVELOPER_TOKEN)

    logging.info("Fetching data from {}".format(datestr))

    bookmarks = pinboard.fetch_from_date(datestr)
    # bookmarks = pinboard.fetch_from_url("http://i.imgur.com/4n92M.jpg")
    # bookmarks = pinboard.fetch_from_url("http://neoocean.net/blog/i/entry/%EB%B2%94%EC%A3%84%EC%97%90-%EB%8C%80%ED%95%9C-%ED%8B%80%EB%A6%B0-%EC%98%88%EC%B8%A1#_post_2057")
    # bookmarks = pinboard.fetch_from_url("http://nullmodel.egloos.com/3425248")
    # bookmarks = pinboard.fetch_from_url("http://www.daniel-lemire.com/blog/archives/2010/11/02/how-do-search-engines-handle-special-characters-should-you-care/")
    # bookmarks = pinboard.fetch_from_url("http://www.1011ltd.com/web/blog/post/evolving_pid")  # no content type returned

    items = []
    for bookmark in reversed(bookmarks):
        logging.info("Handling : {}".format(bookmark.url))
        try:
            resource = URLFetcher(bookmark.url)
        except requests.exceptions.ConnectionError as e:
            logging.error("Failed to fetch resource at {}".format(bookmark.url))
            logging.error("Reason: {}".format(e))
            continue
        except requests.exceptions.TooManyRedirects as e:
            logging.error("Failed to fetch resource at {}".format(bookmark.url))
            logging.error("Reason: {}".format(e))
            continue

        item = Item()
        if resource.is_PDF():
            item = PDFItem.from_pinboard_item(bookmark)
            item.content = resource.fetch()  #FIXME this could take very long. Need a way to address this problem.
        elif resource.is_image():
            item = ImageItem.from_pinboard_item(bookmark)
            item.content_type = resource.image_content_type()
            item.content = resource.fetch()
        elif resource.is_HTML() or resource.is_text():
            if resource.is_HTML():
                item = HTMLItem.from_pinboard_item(bookmark)
                json_result = diffbot.extract(item.url, html=True)
                try:
                    json_object = json.loads(json_result)
                except json.scanner.JSONDecodeError:
                    logging.error("Unable to decode JSON for resource at : {}".format(bookmark.url))
                    continue

                if 'error' in json_object:
                    logging.error("Failed to fetch resource at {}".format(item.url))
                    logging.error(u"Reason: {}".format(json_object['error']))
                    continue

                if 'statusCode' in json_object:
                    if json_object['statusCode'] == 500:
                        logging.error("Failed to fetch resource at {}".format(item.url))
                        logging.error(u"Reason: {}".format(json_object['message']))
                        continue

                if 'html' in json_object:
                    item.content = html2enml(json_object['html'])
                else:
                    # try plaintext
                    if 'text' not in json_object:
                        logging.error("Failed to fetch HTML document at all: {}".format(item.url))
                        continue
                    logging.warn("Failed to fetch HTML document for {}".format(item.url))
                    logging.warn("Degrading to using text summary")
                    item.content = html2enml(json_object['text'])
            else:
                item = TextItem.from_pinboard_item(bookmark)
                json_result = diffbot.extract(item.url, html=True)
                try:
                    json_object = json.loads(json_result)
                except json.scanner.JSONDecodeError:
                    logging.error("Unable to decode JSON for resource at : {}".format(bookmark.url))
                    continue

                # resource is plain text
                contents = resource.fetch().split('\n\n')
                data = "<div>"
                for content in contents:
                    data += ''.join(['<div>' + body + '</div>' for body in content.split('\n')])
                    data += "<div><br /></div>"
                data += "</div>"

                item.content = html2enml(data)

            # Check for default tags
            # FIXME seemingly random criteria for checking tags
            if not item.tags or (item.tags.lower() == 'unread' and len(item.tags.split()) == 1):
                # Diffbot will not contain tags key even if explicitly told to return tags if it does not find any
                if 'tags' in json_object:
                    # autotag tells that this was autotagged.
                    # Evernote cannot handle tags with commas.
                    tags = 'autotag ' + ' '.join(('_'.join(x.replace(',','').split()) for x in json_object['tags']))  # diffbot tags
                    item.tags = tags.encode('utf-8', 'xmlcharrefreplace')

        else:
            logging.error("Unknown content-type of {}".format(resource.content_type))
            continue

        try:
            evernote.push(item)
        except socket.error as e:
            logging.error("Socket error: {}".format(e))
            continue
        except EDAMUserException as e:
            logging.error("Unrecognized evernote type: {}".format(e))
            continue

        pinboard_db.last_updated = item.time

    pinboard_db.close()