PHP Simple HTML DOM Parser makes developers life esier

| |



Today I'm gonna talk about PHP Simple HTML DOM Parser, wich is big time saver for me.


A simple PHP HTML DOM parser written in PHP5+, supports invalid HTML, and provides a very easy way to handle HTML elements.

This is a library written in PHP that gives you dictator like control over HTML. It's the best HTML DOM Parser class on PHP I've ever used.



Quick start

First thing that you want to do is to download Simple HTML DOM Parser from SourceForge. It's freely available under MIT License.

How to Get HTML Elements

Let's say we want to work with HTML code from Google.com. To do this, we need to create a DOM object:
$html file_get_html('http://www.google.com/');
Next, let's find all images and print their src values with this easy way:

foreach($html->find('img') as $element)
    
echo $element->src '<br>';

We can do the same with links and any other elements:
foreach($html->find('a') as $element)
    echo 
$element->href '<br>';
Easy right ? :)

How to modify HTML elements

Let's say we have html code wich needs a bit of modification, for example we have two divs with id assinget to them and we want to change first div content to foo, and set class of bar to the second div. With Simple HTML DOM Parser it's easy to do so:
$html str_get_html('<div id="hello">Hello</div><div id="world">World</div>');
$html
->find('div[id=hello]'0)->innertext 'foo' 
$html->find('div'1)->class 'bar' 
echo 
$html;
Output would be:
<div id="hello">foo</div><div id="world" class="bar">World</div>

Extract Contents from HTML

Imagine that you have highly formated html code with text in different font sizes, colors, styles, etc... And you want to remove any html tags and leave plain text only. How to do this...? Simple!
echo file_get_html('http://www.google.com/')->plaintext;

Scraping Slashdot!

Very good example of how to extract article blocks from Slashdot!:
$html file_get_html('http://slashdot.org/'); 

// Find all article blocks 
foreach($html->find('div.article') as $article) {      
    
$item['title'] = $article->find('div.title'0)->plaintext;      
    
$item['intro']    = $article->find('div.intro'0)->plaintext;      
    
$item['details'] = $article->find('div.details'0)->plaintext;      
    
$articles[] = $item; 
} 

print_r($articles);

How to create HTML DOM object

Quick way

Three easy ways to create HTML DOM object:
// Create a DOM object from a string 
$html str_get_html('<html><body>Hello!</body></html>'); 

// Create a DOM object from a URL 
$html file_get_html('http://www.google.com/'); 

// Create a DOM object from a HTML file 
$html file_get_html('test.htm');

Object-oriented way

Four ways to create object-oriented HTML DOM:
// Create a DOM object
$html = new simple_html_dom();

// Load HTML from a string
$html->load('<html><body>Hello!</body></html>');

// Load HTML from a URL 
$html->load_file('http://www.google.com/');

// Load HTML from a HTML file 
$html->load_file('test.htm');

How to find HTML elements?

Basics

Five basic ways to find html elements:
// Find all anchors, returns a array of element objects
$ret $html->find('a');

// Find (N)th anchor, returns element object or null if not found (zero based)
$ret $html->find('a'0);

// Find lastest anchor, returns element object or null if not found (zero based)
$ret 
$html->find('a', -1); 

// Find all <div> with the id attribute
$ret $html->find('div[id]');

// Find all <div> which attribute id=foo
$ret $html->find('div[id=foo]'); 

Advanced

Five advanced ways to find html elements:
// Find all element which id=foo
$ret $html->find('#foo');

// Find all element which class=foo
$ret $html->find('.foo');

// Find all element has attribute id
$ret $html->find('*[id]'); 

// Find all anchors and images 
$ret $html->find('a, img'); 

// Find all anchors and images with the "title" attribute
$ret $html->find('a[title], img[title]');

Descendant Selectors

Four ways to do decendant selectors:
// Find all <li> in <ul>  
$es $html->find('ul li'); 

// Find Nested <div> tags 
$es $html->find('div div div');  

// Find all <td> in <table> which class=hello  
$es $html->find('table.hello td'); 

// Find all td tags with attribite align=center in table tags  
$es $html->find('table td[align=center]');

Nested Selectors

// Find all <li> in <ul> 
foreach($html->find('ul') as $ul) {        
    foreach(
$ul->find('li') as $li) {              
        
// do something...        
    
}
}

// Find first <li> in first <ul> 
$e $html->find('ul'0)->find('li'0);

Attribute Filters

Parser also supports these operators in attribute selectors:
FilterDescription
[attribute]Matches elements that have the specified attribute.
[!attribute]Matches elements that don't have the specified attribute.
[attribute=value]Matches elements that have the specified attribute with a certain value.
[attribute!=value]Matches elements that don't have the specified attribute with a certain value.
[attribute^=value]Matches elements that have the specified attribute and it starts with a certain value.
[attribute$=value]Matches elements that have the specified attribute and it ends with a certain value.
[attribute*=value]Matches elements that have the specified attribute and it contains a certain value.

Text and Comments

You can even find html comments:
// Find all text blocks 
$es $html->find('text');

// Find all comment (<!--...-->) blocks 
$es $html->find('comment');

How to access the HTML element's attributes

Get, Set and Remove attributes

// Get a attribute ( If the attribute is non-value attribute (eg. checked, selected...), it will returns true or false)
$value $e->href;

// Set a attribute(If the attribute is non-value attribute (eg. checked, selected...), set it's value as true or false)
$e->href 'my link';

// Remove a attribute, set it's value as null! 
$e->href null;

// Determine whether a attribute exist? 
if(isset($e->href))      
    echo 
'href exist!';

Magic attributes

// Example
$html str_get_html("<div>foo <b>bar</b></div>"); 
$e $html->find("div"0);

echo 
$e->tag// Returns: " div"

echo 
$e->outertext// Returns: " <div>foo <b>bar</b></div>"

echo 
$e->innertext// Returns: " foo <b>bar</b>"

echo 
$e->plaintext// Returns: " foo bar"
Attribute NameUsage
$e->tagRead or write the tag name of element.
$e->outertextRead or write the outer HTML text of element.
$e->innertextRead or write the inner HTML text of element.
$e->plaintextRead or write the plain text of element.

Tips

// Extract contents from HTML 
echo $html->plaintext;

// Wrap a element
$e->outertext '<div class="wrap">' $e->outertext '<div>';

// Remove a element, set it's outertext as an empty string 
$e->outertext '';

// Append a element
$e->outertext $e->outertext '<div>foo<div>';

// Insert a element
$e->outertext '<div>foo<div>' $e->outertext;

How to traverse the DOM tree

Background knowledge

If you are not so familiar with HTML DOM, check this link to learn more...
// Example
echo $html->find("#div1"0)->children(1)->children(1)->children(2)->id;

// or 
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');

Traverse the DOM tree

MethodDescription
mixed $e->children ( [int $index] )Returns the Nth child object if index is set, otherwise return an array of children.
element $e->parent ()Returns the parent of element.
element $e->first_child ()Returns the first child of element, or null if not found.
element $e->last_child ()Returns the last child of element, or null if not found.
element $e->next_sibling ()Returns the next sibling of element, or null if not found.
element $e->prev_sibling ()Returns the previous sibling of element, or null if not found.

How to dump contents of DOM object

Quick way

// Dumps the internal DOM tree back into string 
$str $html;

// Print it!
echo $html

Object-oriented way

// Dumps the internal DOM tree back into string 
$str $html->save();

// Dumps the internal DOM tree back into a file 
$html
->save('result.htm');

How to customize the parsing behavior


Callback function

// Write a function with parameter "$element"
function my_callback($element) {         
    // Hide all <b> tags          
    
if ($element->tag=='b')                 
        
$element->outertext '';


// Register the callback function with it's function name

$html
->set_callback('my_callback');

// Callback function will be invoked while dumping
echo 
$html;
As you can see, Simple HTML DOM Parser is very usefull in many situations when parsing HTML.

3 comments:

kick mega said...

Hello, nice tutorial! help me a lot ;)

But I have a question, I´m trying to get some data from for ex:

http://www.labutaca.net/peliculas/rust-and-bone

I get the film main data:

"Película: De óxido y hueso. Título internacional: Rust and bone. Título original: De rouille et d’os. Dirección: Jacques Audiard. Países: Francia y Bélgica. Año: 2012. Duración: 120 min. Género: Drama, romance. Interpretación: Marion Cotillard (Stéphanie), Matthias Schoenaerts (Alain van Versch), Céline Sallette (Louise), Bouli Lanners (Martial), Armand Verduse (Sam), Corinne Masiero (Anna), Jean-Michel Correia (Richard). Guion: Jacques Audiard y Thomas Bidegain; basado en la novela “De rouille et d’os”, de Craig Davidson. Producción: Pascal Caucheteux. Música: Alexandre Desplat. Fotografía: Stéphane Fontaine. Montaje: Juliette Welfling. Diseño de producción: Michel Barthélémy. Vestuario: Virginie Montel. Distribuidora: Vértigo Films. Estreno en Francia: 17 Mayo 2012. Estreno en España: 14 Diciembre 2012. Calificación por edades: No recomendada para menores de 16 años."

with this code:

foreach($html->find('div[id=content]') as $info)
$contenido = $info->find('p',0)->plaintext;

My question is, how can I split that data, and show it as following:

Película: De óxido y hueso.
Título internacional: Rust and bone.
Título original: De rouille et d’os.

Thank you so much

Size Genie said...

Just wanted to say I love reading your blog and look forward to all your posts! Okay everyone... 21 days to go on the kickstarter campaign. We need to pick up the pace a bit. If you want the product before everyone else and get a great discount, back our campaign by going to kickstarter and searching Tidy Snap . Tell everyone you know smile emoticon.

Shruti s said...

very informative post, you have explained very well.
Web Design company in Hubli | web designing in Hubli | SEO company in Hubli

Post a Comment

Related Posts with Thumbnails