ruby-readability icon indicating copy to clipboard operation
ruby-readability copied to clipboard

H1 gets lost

Open louismullie opened this issue 13 years ago • 9 comments

I have been experimenting with the gem to retrieve content from Wikipedia pages, but it seems that the H1 tags get lost during the process of text extraction:

source = open('http://en.wikipedia.org/wiki/Frimley_Green_Windmill').read
puts Readability::Document.new(source, tags: ['h1', 'p', 'div']).content

Output:

<div><div>
<p>Frimley Green Windmill is a Grade II listed[1]tower mill at Frimley Green, Surrey, England which has been converted to residential use.</p>
 [edit] History 
<p>Frimley Green Windmill was first mentioned in 1784 in the ownership of a Mr Terry. It passed to Thomas Lilley in 1792 and then William Collins in 1801. In 1803, the mill passed into the ownership of the Royal Military College, Sandhurst, remaining in the hands of the military until at least 1832 and probably much later than that. The mill was disused by 1870, and the derelict shell was converted to residential use in 1914. [2]</p>
 [edit] Description 
<div>For an explanation of the various pieces of machinery, see Mill machinery.</div>
<p>Frimley Green Windmill is a four storey brick tower mill. Little is known of the mill, although it had at least one pair of Spring or Patent sails.[2]</p>
 [edit] Millers 
 George Marshall 1792
John Banks 1801
 <p>Reference for above:-[2]</p>
 [edit] External links 
 [edit] References 

</div></div>

This is missing the only h1 tag on the page,

<h1 id="firstHeading" class="firstHeading">Frimley Green Windmill</h1>

I have experienced the same quirk with all Wikipedia pages. Any idea what could be causing this?

louismullie avatar Feb 25 '12 20:02 louismullie

A similar behaviour can be experienced with the following HTML (http://www.economist.com/node/21548244) :

<h2 class="fly-title">Campaign finance</h2>
<h3 class="headline">The hands that prod, the wallets that feed</h3>
<h1 class="rubric">Super PACs are changing the face of American politics. </h1>

None of the H1, H2, H3 tags get retrieved even when I specify them in the :tags option.

louismullie avatar Feb 25 '12 21:02 louismullie

What does the JS version of Readability do on those pages?

cantino avatar Feb 26 '12 22:02 cantino

If that's what you mean, the Readability API correctly parses the pages : http://www.readability.com/articles/urlh3i3g, http://www.readability.com/articles/l2exnq9u.

louismullie avatar Feb 27 '12 00:02 louismullie

If you can point me toward the right direction in the code, I can make a patch and I'll send you a pull request.

louismullie avatar Mar 13 '12 18:03 louismullie

They must have revised the Readability code since I last ported it. You'll need to walk through the JavaScript and compare it to what the Ruby is doing. I'm not actively using ruby-readability in any current projects, so I haven't had time to do this myself. It'd be excellent if you want to give it a shot.

ghost avatar Mar 14 '12 05:03 ghost

Alrighty, I'll see what I can do when I have some time.

louismullie avatar Mar 15 '12 04:03 louismullie

This seems to have more to do with where ruby-readability decides where the content of the page lies than what tags it is accepting. Try

source = open('http://en.wikipedia.org/wiki/Frimley_Green_Windmill').read
puts Readability::Document.new(source, tags: ['h1', 'h2', 'p', 'div']).content # added 'h2'

and you will see the h2s from that page. I haven't dug into the source enough to see why, but it doesn't seem to be a headline issue at least. The markup on the economist page doesn't seem super helpful to a generic library like this. I wonder how they do it now (where they are catching these)...

mraaroncruz avatar Aug 09 '12 10:08 mraaroncruz

The problem appears when h1 elements are contained outside the best candidate. This is an example:

<div id="container">
    <div id="article">
        <h1>Main title</h1>

        <div id="content">
           <h2>Section title</h2>
           <p>content</p>
           <p>content</p>

           <h2>Section title</h2>
           <p>content</p>
        </div>
    </div>
</div>

The #content element will always have a better score than #article because it always has an higher link density (same number of links, less content). The h1 in #article will thus never be included in the result. This confirms the idea of @pferdefleisch.

A possible solution may be to increase the score of an element if it contains many non-excluded elements. This will increase the score of the #article element because it will include strictly more accepted tags than #content.

gioele avatar Mar 29 '13 23:03 gioele

That's interesting. If you want to propose a pull request, that seems like a reasonable solution unless it breaks a lot of specs/behaviors.

cantino avatar Mar 30 '13 01:03 cantino