Module for automatic summarization of text documents and HTML pages.

Overview

Automatic text summarizer

image Gitpod Ready-to-Code

Simple library and command line utility for extracting summary from HTML pages or plain texts. The package also contains simple evaluation framework for text summaries. Implemented summarization methods are described in the documentation. I also maintain a list of alternative implementations of the summarizers in various programming languages.

Is my natural language supported?

There is a good chance it is. But if not it is not too hard to add it.

Installation

Make sure you have Python 3.5+ and pip (Windows, Linux) installed. Run simply (preferred way):

$ [sudo] pip install sumy
$ [sudo] pip install git+git://github.com/miso-belica/sumy.git  # for the fresh version

Usage

Sumy contains command line utility for quick summarization of documents.

$ sumy lex-rank --length=10 --url=http://en.wikipedia.org/wiki/Automatic_summarization # what's summarization?
$ sumy luhn --language=czech --url=http://www.zdrojak.cz/clanky/automaticke-zabezpeceni/
$ sumy edmundson --language=czech --length=3% --url=http://cs.wikipedia.org/wiki/Bitva_u_Lipan
$ sumy --help # for more info

Various evaluation methods for some summarization method can be executed by commands below:

$ sumy_eval lex-rank reference_summary.txt --url=http://en.wikipedia.org/wiki/Automatic_summarization
$ sumy_eval lsa reference_summary.txt --language=czech --url=http://www.zdrojak.cz/clanky/automaticke-zabezpeceni/
$ sumy_eval edmundson reference_summary.txt --language=czech --url=http://cs.wikipedia.org/wiki/Bitva_u_Lipan
$ sumy_eval --help # for more info

If you don't want to bother by the installation, you can try it as a container.

$ docker run --rm misobelica/sumy lex-rank --length=10 --url=http://en.wikipedia.org/wiki/Automatic_summarization

Python API

Or you can use sumy like a library in your project. Create file sumy_example.py (don't name it sumy.py) with the code below to test it.

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import division, print_function, unicode_literals

from sumy.parsers.html import HtmlParser
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lsa import LsaSummarizer as Summarizer
from sumy.nlp.stemmers import Stemmer
from sumy.utils import get_stop_words


LANGUAGE = "english"
SENTENCES_COUNT = 10


if __name__ == "__main__":
    url = "https://en.wikipedia.org/wiki/Automatic_summarization"
    parser = HtmlParser.from_url(url, Tokenizer(LANGUAGE))
    # or for plain text files
    # parser = PlaintextParser.from_file("document.txt", Tokenizer(LANGUAGE))
    # parser = PlaintextParser.from_string("Check this out.", Tokenizer(LANGUAGE))
    stemmer = Stemmer(LANGUAGE)

    summarizer = Summarizer(stemmer)
    summarizer.stop_words = get_stop_words(LANGUAGE)

    for sentence in summarizer(parser.document, SENTENCES_COUNT):
        print(sentence)

Interesting projects using sumy

I found some interesting projects while browsing the interner or sometimes people wrote me an e-mail with questions and I was curious how they use the sumy :)

Comments
  • Error with using 'English' as language.

    Error with using 'English' as language.

    Upgraded Sumy and get this error upon running it.

    The debugged program raised the exception unhandled TypeError "new() takes exactly 2 arguments (1 given)" File: /usr/local/lib/python2.7/dist-packages/sumy/nlp/stemmers/german.py, Line: 9 Break here?

    invalid 
    opened by shavid 19
  • Crash: LinAlgError: SVD did not converge

    Crash: LinAlgError: SVD did not converge

    I am getting a crash during the singlar value decomposition in lsa.py:

    u, sigma, v = singular_value_decomposition(matrix, full_matrices=False)

    The exception is LinAlgError: SVD did not converge

    I saved the input file here: http://pastebin.com/s0RNZ2J2

    To Reproduce:

    # "text" is the input text saved at http://pastebin.com/s0RNZ2J2
    parser = PlaintextParser.from_string(text, LawTokenizer("english"))
    # I'm using the porter2 stemmer, but I don't think that matters
    summarizer = sumy.summarizers.lsa.LsaSummarizer(stem_word)
    # This is the standard stop words list
    summarizer.stop_words = get_stop_words("english")   
    # We get the crash here when it calls down to lsa.py
    summaries = summarizer(parser.document, sentences)
    
    opened by speedplane 12
  • spanish support for sumy

    spanish support for sumy

    Hi, I would like that you add spanish support for the project. In my town there are a research group very interested in this project with the spanish support

    enhancement 
    opened by debzar 10
  • How to summarize .txt files.

    How to summarize .txt files.

    Hi,

    I've had a mess around with Sumy and it seems to be perfect for the small project I've been working on. However I've only been able to work with URL's. What code would i need to implement to summarize a block of text. Either saved in a variable or loaded from a .txt file.

    Regards.

    question 
    opened by shavid 8
  • Help with creating parser object from pandas dataframe

    Help with creating parser object from pandas dataframe

    @miso-belica

    Hi Miso

    I am new to python. I am trying to summarize data which I have in mysql table. I am reading that data in pandas dataframe and creating a list from the column which needs to be summarized. Can you please help me on how to create a object from pandas dataframe column that is similar to below object. parser = PlaintextParser.from_file(r"....\document.txt", Tokenizer(LANGUAGE)) which can be passed as parameter to summarizer as parser.document.

    Also if you can give me an example on how to use sum_eval in IDE, rather than command line, that would be helpful.

    Regards Viney Sindhu

    invalid 
    opened by vineysindhu 7
  • Adding support for French + more concise & generic NLTK stemmers import

    Adding support for French + more concise & generic NLTK stemmers import

    Hi !

    That's just a minor change to add French language support. I also refactored a little bit sumy/nlp/stemmers/init.py

    If you have any criticism about this patch, please tell me and I'll be happy to fix it.

    Here is the testing I've done:

    $ sumy edmundson --language=french --length=3% --url=http://fr.wikipedia.org/wiki/Trouble_du_d%C3%A9ficit_de_l%27attention Pour les articles homonymes, voir TDA . Sa détection et les soins à apporter font l'objet de nombreuses controverses. Le TDA/H a un aspect héréditaire, impliquant notamment le rôle des transporteurs de dopamine . Le trouble dit « du déficit de l'attention » semble pouvoir avoir une ou plusieurs causes environnementales : Les corrélations statistiques issues d'observations épidémiologiques ne permettent pas d'affirmer avec certitude l'existence d'un lien de causalité ; d'autres facteurs non identifiés pouvant souvent intervenir pour expliquer les liens observés. Le TDAH serait la cause, plutôt que l'effet [30] Le médicament représente certes un aspect de la prise en charge du TDAH mais n’en constitue pas la totalité [59] : spécialistes et associations de patients s'accordent à promouvoir des prises en charges multimodales faisant appel à de nombreuses compétences [60] . Depuis quelques années, on propose à certains patients une prise en charge en remédiation cognitive, notamment celles ciblant la mémoire de travail [64] . (2006), Long-term effects of frequent cannabis use on working memory and attention: an fMRI study, Psychopharmacology, 185 (3), 358-368.

    $ sumy lex-rank --length=10 --url=http://en.wikipedia.org/wiki/Automatic_summarization Such a summary might contain words not explicitly present in the original. Even though automating abstractive summarization is the goal of summarization research, most practical systems are based on some form of extractive summarization. Furthermore, evaluation of extracted summaries can be automated, since it is essentially a classification task. It consists in selecting a representative set of images from a larger set of images. Beginning with the Turney paper [ citation needed ] , many researchers have approached keyphrase extraction as a supervised machine learning problem. Design choices[ edit ] Designing a supervised keyphrase extraction system involves deciding on several choices (some of these apply to unsupervised, too): What are the examples? [ edit ] The first choice is exactly how to generate examples. [ edit ] We also need to create features that describe the examples and are informative enough to allow a learning algorithm to discriminate keyphrases from non- keyphrases. Furthermore, training on a specific domain tends to customize the extraction process to that domain, so the resulting classifier is not necessarily portable, as some of Turney's results demonstrate.

    $ sumy luhn --language=czech --url=http://www.zdrojak.cz/clanky/automaticke-zabezpeceni/ Za cenu o něco složitějšího jádra bude veškerý kód, který ho používá, obvykle taky mnohem jednodušší. Druhou úroveň představuje ruční ošetřování pomocí htmlspecialchars . Třetí úroveň zdánlivě reprezentuje automatické ošetřování v šablonách, např. v Nette Latte . Problém je v tom, že ošetření se dá obvykle snadno zakázat, např. v Latte pomocí {!$var} . Druhou úroveň představuje ruční ošetřování pomocí mysql_real_escape_string nebo obdobné funkce. Třetí úroveň zdánlivě reprezentuje vázání proměnných, např. v PDO . Problém je v tom, že napsat $pdo->prepare("... WHERE id = $_GET[id]") je funkční a ještě jednodušší než $pdo->prepare("... WHERE id = ? V některých případech to je dokonce jediné možné řešení, alternativu k $pdo->prepare("... ORDER BY $_GET[order]") vázání proměnných nenabízí. Chybu pořád lze udělat, i když bezpečná verze je ve většině případů alespoň jednodušší: where("id", $_GET["id"]) je jednodušší než where("id = $_GET[id]") . Další běžná chyba , kde je řešení druhé úrovně jednoduché: stačí místo WHERE id = ? Pokud žádné ID uživatele uložené nemáme, dá se místo snadno uhodnutelného číselného ID použít dlouhé náhodné GUID. Za cenu o něco složitějšího jádra bude veškerý kód, který ho používá, obvykle taky mnohem jednodušší.

    enhancement 
    opened by Lucas-C 7
  • Documentation Site?

    Documentation Site?

    Hi,

    Thank you for the package. It seems to be very useful for working with Extractive Summarization methods. Considering the popularity of the package, I was expecting it to have a proper documentation site like other famous packages. It seems like currently, the README file is the only available documentation. That can't be true, right? While the README is a good place to get a gist of the functionality, the details about different classes, functions and their parameters need a separate place of their own. If it already exists, kindly point me towards it.

    Thanks.

    bug 
    opened by ghost 6
  • Runtime division error in Text Rank

    Runtime division error in Text Rank

    In Text rank Matrix weights are divided as : -> weights /= weights.sum(axis=1)[:, numpy.newaxis] The above command causes runtime division error when row is zero

    opened by sarthusarth 6
  • Documentation and Examples for other summarizers

    Documentation and Examples for other summarizers

    I see the documentation for the LSA summarizer and how you should use it in python. I was wondering if you could also add examples on how to use, the other types of summarization, in python?

    Thanks, Sam

    opened by gadgetsam 6
  • Lexrank scores all the sentences the same.

    Lexrank scores all the sentences the same.

    No matter what are the sentences, the scores returned by lexrank is the same for all the sentences. i.e. 1/count(sentences) lex_rank.py

    file: lex_rank.py
    ...
    [41] matrix = self._create_matrix(sentences_words, self.threshold, tf_metrics, idf_metrics)
    [42] scores = self.power_method(matrix, self.epsilon)
    print scores
    >>> [0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329, 0.083333333333333329]
    
    bug duplicate 
    opened by armancohan 6
  • Adding --stopwords-file option + refactoring & testing __main__.py

    Adding --stopwords-file option + refactoring & testing __main__.py

    Here it comes !

    Specifically, tell me if you're ok with the simplification of the USAGE at the beginning of main.py It's only one line now, but the code may have lost in readibility.

    enhancement 
    opened by Lucas-C 6
  • sumbasic: KeyError

    sumbasic: KeyError

    sumbasic failed on text: common.txt

    Traceback (most recent call last):
      File "summerisers.py", line 39, in <module>
        summary = " ".join([obj._text for obj in s(parser.document, sentenceCntOut)])
      File "C:\py38_64\lib\site-packages\sumy\summarizers\sum_basic.py", line 27, in __call__
        ratings = self._compute_ratings(sentences)
      File "C:\py38_64\lib\site-packages\sumy\summarizers\sum_basic.py", line 110, in _compute_ratings
        best_sentence_index = self._find_index_of_best_sentence(word_freq, sentences_as_words)
      File "C:\py38_64\lib\site-packages\sumy\summarizers\sum_basic.py", line 92, in _find_index_of_best_sentence
        word_freq_avg = self._compute_average_probability_of_words(word_freq, words)
      File "C:\py38_64\lib\site-packages\sumy\summarizers\sum_basic.py", line 75, in _compute_average_probability_of_words
        word_freq_sum = sum([word_freq_in_doc[w] for w in content_words_in_sentence])
      File "C:\py38_64\lib\site-packages\sumy\summarizers\sum_basic.py", line 75, in <listcomp>
        word_freq_sum = sum([word_freq_in_doc[w] for w in content_words_in_sentence])
    KeyError: 'look'
    

    sumy==0.10.0

    bug 
    opened by mrx23dot 3
  • Would you be interested in adding more modern extractive summarization methods using things like BERT?

    Would you be interested in adding more modern extractive summarization methods using things like BERT?

    I'm working on replacing sumy in an existing project with a BERT based summarization model. Would you be interested in me making a PR which adds a BERTSummarizer class to this repository? Basically using this: https://arxiv.org/pdf/1906.04165.pdf. It would add a number of additional dependencies and wouldn't be compatible with python 2.7. Just thought I'd offer while I was working on it : ).

    opened by nbertagnolli 3
  • Becomes slow with huge text

    Becomes slow with huge text

    it seems to work fine with small text data however when i tried to use the same for document(approx 2000 lines) , it became way too slow.. and took around 20 mins to summarize 50 documents. So is there any parameter , specific algo which can be used to solve this issue.

    opened by deepaksinghtopwal 4
  • Support for list of pre-generated stems/lemmas

    Support for list of pre-generated stems/lemmas

    Good morning first of all I wanted to congratulate with you for this awesome repository, it really is very well made and the practical results are great, on top of being easy to achieve.
    I was wondering: is there a way I can use a pre-processed list of strings, being stems or lemmas, with your example pipeline?

    question 
    opened by DavMrc 3
  • Tokenizer/Stemmer and few other questions

    Tokenizer/Stemmer and few other questions

    Hey Mišo

    I spent a lot of time on text rank and while digging deeper into Sumy I want to ask you a few clarifying questions about some of the choices you made: This is all for English language.

    1. _WORD_PATTERN = re.compile(r"^[^\W\d_]+$", re.UNICODE)

    Used with word_tokenize() to filter 'non-word' words. The problem is it "kills" words like "data-mining" or "sugar-free". Also word_tokenize is very slow. Here is an alternative to replace these two to consider:

    WORDS = re.compile(r"\w+(?:['-]\w+)*")
    words = WORDS.findall(sentence)
    
    1. What made you choose Snowball vs Porter stemmer.

    Snowball: DVDs -> dvds Porter: DVDs -> dvd

    I don't have particual opinion just wondering how did you make the decision.

    1. How did you come up with your stopwords (for english?) It is very different thatn nltk defaults for example.

    2. Heuristics in plaintext parser are interesting.

    In this example of text extracted from https://www.karoly.io/amazon-lightsail-review-2018/

    Is Amazon Lightsail worth it?
    Written by Niklas Karoly 10/28/2018 • 8 min read
    Amazon AWS Lightsail review 2018
    In November of 2016 AWS launched its brand Amazon Lightsail to target the ever growing market that DigitalOcean , Linode and co. made popular.
    

    This ends up as two sentences instead of four.

    question 
    opened by vprelovac 3
Releases(v0.11.0)
  • v0.11.0(Oct 23, 2022)

    • FIX: Greek stemmer bug fix by @NC0DER in https://github.com/miso-belica/sumy/pull/175
    • FIX: Avoid to add empty space between words and punctations. by @gianpd in https://github.com/miso-belica/sumy/pull/178
    • DOC: Fix a few typos by @timgates42 in https://github.com/miso-belica/sumy/pull/182
    • FEATURE: Add Arabic language support by @issam9 in https://github.com/miso-belica/sumy/pull/181
    Source code(tar.gz)
    Source code(zip)
  • v0.10.0(Apr 21, 2022)

    What's Changed

    • FEATURE: Add support for Ukrainian language in https://github.com/miso-belica/sumy/pull/168
    • FEATURE: Add support for the Greek Language by @NC0DER in https://github.com/miso-belica/sumy/pull/169
    • FEATURE: Return the summary size by custom callable object in https://github.com/miso-belica/sumy/pull/161
    • FIX: Compatibility for from collections import Sequence for Python 3.10
    • FIX: Fix SumBasicSummarizer with stemmer in https://github.com/miso-belica/sumy/pull/166

    New Contributors

    • @NC0DER made their first contribution in https://github.com/miso-belica/sumy/pull/169

    Full Changelog: https://github.com/miso-belica/sumy/compare/v0.9.0...v0.10.0

    Source code(tar.gz)
    Source code(zip)
  • v0.9.0(Oct 21, 2021)

    What's Changed

    • INCOMPATIBILITY Dropped official support for Python 2.7. It should still work if you install Python 2 compatible dependencies.
    • FEATURE: Add basic Korean support by @kimbyungnam in https://github.com/miso-belica/sumy/pull/129
    • FEATURE: Add support for the Hebrew language by @miso-belica in https://github.com/miso-belica/sumy/pull/151
    • FIX: Allow words with dashes/apostrophe returned from tokenizer by @miso-belica in https://github.com/miso-belica/sumy/pull/144
    • FIX: Ignore empty sentences from tokenizer by @miso-belica in https://github.com/miso-belica/sumy/pull/153
    • Basic documentation by @miso-belica in https://github.com/miso-belica/sumy/pull/133
    • Speedup of the TextRank algorithm by @miso-belica in https://github.com/miso-belica/sumy/pull/140
    • Fix missing license in sdist by @dopplershift in https://github.com/miso-belica/sumy/pull/157
    • added test and call for stemmer by @bdalal in https://github.com/miso-belica/sumy/pull/131
    • Fix simple typo: referene -> reference by @timgates42 in https://github.com/miso-belica/sumy/pull/143
    • Add codecov service to tests by @miso-belica in https://github.com/miso-belica/sumy/pull/136
    • Add gitpod config by @miso-belica in https://github.com/miso-belica/sumy/pull/138
    • Try to run Python 3.7 and 3.8 on TravisCI by @miso-belica in https://github.com/miso-belica/sumy/pull/130
    • Fix TravisCI for Python 3.4 by @miso-belica in https://github.com/miso-belica/sumy/pull/134

    New Contributors

    • @bdalal made their first contribution in https://github.com/miso-belica/sumy/pull/131
    • @kimbyungnam made their first contribution in https://github.com/miso-belica/sumy/pull/129
    • @timgates42 made their first contribution in https://github.com/miso-belica/sumy/pull/143
    • @dopplershift made their first contribution in https://github.com/miso-belica/sumy/pull/157

    Full Changelog: https://github.com/miso-belica/sumy/compare/v0.8.1...v0.8.2

    Source code(tar.gz)
    Source code(zip)
  • v0.8.1(May 19, 2019)

  • v0.8.0(May 19, 2019)

    • Added support for Italian language #114
    • Added support for ISO-639 language codes (en, de, sk, ...). #106
    • TextRankSummarizer uses iterative algorithm. Previous algorithm is called ReductionSummarizer. #100
    Source code(tar.gz)
    Source code(zip)
  • v0.7.0(Jul 22, 2017)

  • v0.6.0(Mar 5, 2017)

    • Dropped support for distutils when installing sumy.
    • Added support for Japanese. Thanks to @tuvistavie.
    • Fixed incorrect n-grams computation for more sentences. Thanks to @odek53r.
    • Fixed NLTK dependency for Python 3.3. NLTK 3.2 dropped support for Python 3.3 so sumy needs 3.1.
    Source code(tar.gz)
    Source code(zip)
  • v0.5.1(Nov 17, 2016)

  • v0.5.0(Nov 12, 2016)

  • v0.4.1(Mar 6, 2016)

  • v0.4.0(Dec 6, 2015)

    • Dropped support for Python 2.6 and 3.2. Only 2.7/3.3+ are officially supported now. Time to move :)
    • CLI: Better message for unknown format.
    • LexRank: fixed power method computation.
    • Added some extra abbreviations (english, german) into tokenizer for better output.
    • SumBasic: Added new summarization method - SumBasic. Thanks to @JulianGriggs.
    • KL: Added new summarization method - KL. Thanks to @JulianGriggs.
    • Added dependency requests to fix issues with downloading pages.
    • Better documentation of expected Plaintext document format.
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Aug 29, 2015)

    • Added possibility to specify format of input document for URL & stdin. Thanks to @Lucas-C.
    • Added possibility to specify custom file with stop-words in CLI. Thanks to @Lucas-C.
    • Added support for French language (added stopwords & stemmer). Thanks to @Lucas-C.
    • Function sumy.utils.get_stop_words raises LookupError instead of ValueError for unknown language.
    • Exception LookupError is raised for unknown language of stemmer instead of falling silently to null_stemmer.
    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Aug 29, 2015)

  • v0.2.0(Aug 29, 2015)

  • v0.1.0(Aug 29, 2015)

Owner
Mišo Belica
Introvert http://git-awards.com/users/miso-belica
Mišo Belica
Pythonic HTML Parsing for Humans™

Requests-HTML: HTML Parsing for Humans™ This library intends to make parsing HTML (e.g. scraping the web) as simple and intuitive as possible. When us

Python Software Foundation 12.9k Jan 1, 2023
News, full-text, and article metadata extraction in Python 3. Advanced docs:

Newspaper3k: Article scraping & curation Inspired by requests for its simplicity and powered by lxml for its speed: "Newspaper is an amazing python li

Lucas Ou-Yang 12.3k Jan 1, 2023
Zotero2Readwise - A Python Library to retrieve annotations and notes from Zotero and upload them to your Readwise

Zotero ➡️ Readwise zotero2readwise is a Python library that retrieves all Zotero

Essi Alizadeh 49 Dec 20, 2022
Module for automatic summarization of text documents and HTML pages.

Automatic text summarizer Simple library and command line utility for extracting summary from HTML pages or plain texts. The package also contains sim

Mišo Belica 3k Jan 8, 2023
Module for automatic summarization of text documents and HTML pages.

Automatic text summarizer Simple library and command line utility for extracting summary from HTML pages or plain texts. The package also contains sim

Mišo Belica 2.5k Feb 17, 2021
Python implementation of TextRank for phrase extraction and summarization of text documents

PyTextRank PyTextRank is a Python implementation of TextRank as a spaCy pipeline extension, used to: extract the top-ranked phrases from text document

derwen.ai 1.9k Jan 6, 2023
Python implementation of TextRank for phrase extraction and summarization of text documents

PyTextRank PyTextRank is a Python implementation of TextRank as a spaCy pipeline extension, used to: extract the top-ranked phrases from text document

derwen.ai 1.4k Feb 17, 2021
This is REST-API for Indonesian Text Summarization using Non-Negative Matrix Factorization for the algorithm to summarize documents and FastAPI for the framework.

Indonesian Text Summarization Using FastAPI This is REST-API for Indonesian Text Summarization using Non-Negative Matrix Factorization for the algorit

Viqi Nurhaqiqi 2 Nov 3, 2022
Django-Text-to-HTML-converter - The simple Text to HTML Converter using Django framework

Django-Text-to-HTML-converter This is the simple Text to HTML Converter using Dj

Nikit Singh Kanyal 6 Oct 9, 2022
Small python-gtk application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface

Small python-gtk application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface

null 1.8k Dec 29, 2022
mlscraper: Scrape data from HTML pages automatically with Machine Learning

?? Scrape data from HTML websites automatically with Machine Learning

Karl Lorey 798 Dec 29, 2022
Bootstraparse is a personal project started with a specific goal in mind: creating static html pages for direct display from a markdown-like file

Bootstraparse is a personal project started with a specific goal in mind: creating static html pages for direct display from a markdown-like file

null 1 Jun 15, 2022
Standards-compliant library for parsing and serializing HTML documents and fragments in Python

html5lib html5lib is a pure-python library for parsing HTML. It is designed to conform to the WHATWG HTML specification, as is implemented by all majo

null 1k Dec 27, 2022
Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API

Dominate Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API. It allows you to write HTML pages in pure

Tom Flanagan 1.5k Jan 9, 2023
Parsel lets you extract data from XML/HTML documents using XPath or CSS selectors

Parsel Parsel is a BSD-licensed Python library to extract and remove data from HTML and XML using XPath and CSS selectors, optionally combined with re

Scrapy project 859 Dec 29, 2022
DocumentPy is a Python application that runs in a command-line interface environment, made for creating HTML documents.

DocumentPy DocumentPy is a Python application that runs in a command-line interface environment, made for creating HTML documents. Usage DocumentPy, a

Lotus 0 Jul 15, 2021
That project takes as input special TXT File, divides its content into lsit of HTML objects and then creates HTML file from them.

That project takes as input special TXT File, divides its content into lsit of HTML objects and then creates HTML file from them.

null 1 Jan 10, 2022
A HTML-code compiler-thing that lets you reuse HTML code.

RHTML RHTML stands for Reusable-Hyper-Text-Markup-Language, and is pronounced "Rech-tee-em-el" despite how its abbreviation is. As the name stands, RH

Duckie 4 Nov 15, 2021
Use minify-html, the extremely fast HTML + JS + CSS minifier, with Django.

django-minify-html Use minify-html, the extremely fast HTML + JS + CSS minifier, with Django. Requirements Python 3.8 to 3.10 supported. Django 2.2 to

Adam Johnson 60 Dec 28, 2022