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:Next, let's find all images and print their src values with this easy way:$html = file_get_html('http://www.google.com/');
We can do the same with links and any other elements:foreach($html->find('img') as $element)
echo $element->src . '<br>';
Easy right ? :)foreach($html->find('a') as $element)
echo $element->href . '<br>';
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:Output would be:$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;
<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:
Filter Description [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 Name Usage $e->tag Read or write the tag name of element. $e->outertext Read or write the outer HTML text of element. $e->innertext Read or write the inner HTML text of element. $e->plaintext Read 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
Method Description 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
As you can see, Simple HTML DOM Parser is very usefull in many situations when parsing HTML.// 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;
5 comments:
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
very informative post, you have explained very well.
Web Design company in Hubli | web designing in Hubli | SEO company in Hubli
Its very great article post, share more updates.
mobile application development in hyderabad
Hi,
Thanks for sharing a very interesting article about PHP Simple HTML DOM Parser makes developers life easier. This is very useful information for online blog review readers. Keep it up such a nice posting like this.
Regards,
Web Design Company Bangalore
Thank you so much for sharing this pretty post, it was so good to read and useful to improve my knowledge as updated one, keep blogging
Dot Net Training And Placement in Chennai | Best Dot Net Training in Chennai
Software Testing Training Institute in Chennai | Best Software Testing Training Institute in Chennai
Java Classes in Chennai | Java Training with Placement | Java Training Institutes in Chennai with 100 Placement
PHP Course in Chennai | PHP Certification in chennai | PHP Training Institutes
Post a Comment