Package: eatiht
A python package forextractingarticletextinhtml documents. Check out the new twitter-bootstrap-readydemoproduced by the new extraction algorithm!Latest NewsCheck out my latest project:autocomplete - a kid and adult friendly
exercise in machine
learningI’m collaborating withTim Weningerin a must-read data-driven opinion piece (publish date is tba). I
benchmarked Eatiht and many more content extractors; you can follow thecurrent work
here!.ReadMatthew Peters’sarticle that
benchmarked Eatiht, along with few other content extractors written in
Python.tl;dr: Eatiht’s etv2 is fast, but not so accurate (my own research
suggests that the original algo is more reliable).Check out eatiht’swebsitewhere I walk through each step in the original algorithm!Follow me ontwitter:)What people have been sayingYou should write a paper on this work-/u/queue_cumberThis is neat-o. A short and sweet project…-/u/CandyCorns_This is both useful and shows a simple use case for data mining for the
general population - an outreach of sorts.-/u/tweningerAt a GlanceTo install:pipinstalleatiht...easy_installeatihtNote: On Windows, you may need to install lxml manually using: pip
install lxmlUsing in PythonCurrently, there are two new submodules:etv2.py - class-based approachv2.py - script-like approachAsrequested,
etv2.extract will extract not only the text, but also the parent
element’s html:importeatiht.etv2asetv2url="http://sputniknews.com/middleeast/20141225/1016239222.html"tree=etv2.extract(url)# we know what this does...# print tree.get_text()# add necessary link tags to bootstrap cdn, center content, etc.tree.bootstrapify()printtree.get_html_string()Output:<html><head><title>Syrian Army Kills Nearly 5,000 IS Militants in Three Months: Source / Sputnik International</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" type="text/css" rel="stylesheet"></head>
<body><h2>Syrian Army Kills Nearly 5,000 IS Militants in Three Months: Source / Sputnik International</h2>...Now what about if that’s rendered?With
boostrapWithoutetv2 uses classes defined ineatiht_trees.pyto construct what is sometimes known as the “state space” in the world
of AI. But instead of only keeping track of averages and totals - as is
required for the algorithm - the “state” classTextNodeSubTreealso keeps a reference to its original lxml.html element from whence it
came.You can access the original, extracted html elements like this:subtrees=tree.get_subtrees()first_subtree=subtrees[0]first_subtree.get_html()# <Element div at 0x2f88cc8>first_subtree.get_html().tag# 'div'Please refer toeatiht_trees.pyfor more info on what functions are available for you to use.v2 is functionally identical to the original eatiht:importeatiht.v2asv2url='http://www.washingtonpost.com/blogs/the-switch/wp/2014/12/26/elon-musk-the-new-tesla-roadster-can-travel-some-400-miles-on-a-single-charge/'printv2.extract(url)Output:Car nerds, you just got an extra present under the tree.

Tesla announced Friday an upgrade for its Roadster, the electric car company’s convertible model,
and said that the new features significantly boost its range -- beyond what many traditional cars
can get on a tank of gasoline.v2 contains one extra function that executes the extraction algorithm,
but along with returning the text, it also returns the structures that
were used to calculate the output (ie. histogram, list of xpaths, etc.):results=v2.extract_more(url)results[0]# extracted textresults[1]# frequency distribution (histogram)results[2]# subtrees (list of textnodes pre-filter)results[3]# pruned subtreesresults[4]# list of paragraphs (as seperated in original website)Now whether or not this function’s output looks messy is up for debate;
I personally think it looks messy and difficult to remember which index
leads to what.I suggest using this module if you simply want the extracted text.And of course, there is the original:# from initial releaseimporteatihturl='http://news.yahoo.com/curiosity-rover-drills-mars-rock-finds-water-122321635.html'printeatiht.extract(url)OutputNASA's Curiosity rover is continuing to help scientists piece together the mystery of how Mars
lost its surface water over the course of billions of years. The rover drilled into a piece of
Martian rock called Cumberland and found some ancient water hidden within it...Using as a command line tool:eatihthttp://news.yahoo.com/curiosity-rover-drills-mars-rock-finds-water-122321635.html>>out.txtNote: Window’s users may have to add the C:directory to your“path”so that the
command line tool works from any directory, not only the ..directory.Requirementslxml
*requests, as of v0.1.0, is no longer requiredMotivationAfter searching through the deepest crevices of the internet for some
tool|library|module that could effectively extract the main content
from a website (ignoring text from ads, sidebar links, etc.), I was
slightly disheartened by the apparent ambiguity caused by this
content-extraction problem.My survey resulted in some of the following solutions:boilerpipe-Boilerplate
Removal and Fulltext Extraction from HTML pages. Java library
written by Christian Kohlschütter“The Easy Way to Extract Useful Text from Arbitrary
HTML”- a Python tutorial on implementing a neural network for html content
extraction. Written by alexjcPyteaser’s Cleaners
module- from what I can tell, it’s a purely heuristic-based process“Text Extraction from the Web via Text-to-Tag
Ratio”- a
thesis on Text-to-Tag-heuristic driven clustering as a solution for
the problem at hand. Written by Tim Weninger & William H. HsuThe number of research papers I found on the subject largely outweighs
the number available open-source projects. This is my attempt at
balancing out the disparity.In the process of coming up with a solution, I made two unoriginal
observations:XPath’s select all (//), parent node (..) queries and functions
(‘string-length’) are remarkably powerful when used togetherUnnecessary machine learning is unnecessaryBy making an assumption on sentence length, and this is trivial, one can
query for text-nodes satisfying said sentence length, then create a
frequency distribution (histogram) across the parent-nodes, and the
argmax of the resulting distribution is the xpath that is shared amongst
likely sentences.The results were surprisingly good. I personally prefer this approach to
the others as it seems to lie somewhere in between the purely rule-based
and the drowning-in-ML approaches.Issues or ContactPlease raise anyissuesor yell at me atrodrigopala91@gmail.comor
[@rodricios](https://twitter.com/rodricios)TestsCurrently, the tests are lacking. But please still run these tests to
ensure that modifications to eatiht.py, v2.py, and etv2.py run properly.pythonsetup.pytestTODO:[STRIKEOUT:HTML-and-text extraction]etv2 command line scripts[STRIKEOUT:etv2.py tests]improve filtering|pruning step so that taglines from articles get
droppedif and only if tagline has a reference image, don’t pruneadd some template engine (see “bootstrapify” function for current
state)