Friday, September 15, 2017

Counting li items from a html file using php

Leave a Comment

I have an HTML file that contains many many JUST "li" tags no head and body tag and any thing else. I want to count them using PHP. how can I do this?

However, I tried this:

$dom = new DOMDocument(); DOMDocument::loadHTML($tmp_file); $count = $dom->getElementsByTagName("li"); echo count($count); 

but it returns 1.

Here is the $tmp_file (I don't know how many is them will be retrieved (may be hundred of them) but I just add 5 of them to here):

<li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426832/میروسلاو-ژیوکو-سرمربی-تیم-والیبال-سایپا-شد" target="_blank" title="میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد">میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426824/فدرر-از-نظر-فیزیکی-شرایط-سال-قبل-را-ندارم" target="_blank" title="فدرر: از نظر فیزیکی شرایط سال قبل را ندارم">فدرر: از نظر فیزیکی شرایط سال قبل را ندارم</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426817/شکست-تیم-&#171;الف&#187;-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند">شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند</a> </li> <li class="news-video">     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426815/5-حرکت-دیدنی-در-لیگ-تابستان-NBA؛-96-04-21" target="_blank" title="5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21">5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426813/معرفی-هیات-مدیره-جدید-صندوق-حمایت-از-پیشکسوتان" target="_blank" title="معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان">معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426808/رحیمی،-یزدانی-و-قاسمی-در-رده-اول-تا-سوم-جهان" target="_blank" title="رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان">رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426792/جوکوویچ-منتظر-رویارویی-با-بردیچ-هستم" target="_blank" title="جوکوویچ: منتظر رویارویی با بردیچ هستم">جوکوویچ: منتظر رویارویی با بردیچ هستم</a> </li> 

12 Answers

Answers 1

You're close. I think what you're looking for is the following :

$dom = new \DOMDocument(); @$dom->loadHTML($html); // or @$dom->loadHTMLFile($filename); if providing filename rather than actual HTML content  $count = $dom->getElementsByTagName('li')->length; echo $count; 

Depending on your value of $tmp_file you would use either loadHTML() if it contains the actual content, or loadHTMLFile() if it contains the filename. (Note that these methods should not be called statically.)

The method getElementsByTagName() returns a DOMNodeList object with a length property containing the number of found nodes.

You can try the code here.

This DOM parsing approach is preferable to string or regular expression searches since it is designed to account for the many variable ways that HTML may be acceptably written (ie. inconsistent spacing, attribute order).

Answers 2

You can do a very simple Substring Count for <li> (or -li-) on that string and it would return the number of items. See here: function.substr-count

$count = substr_count($html,'<li>'); //where $html holds your piece of HTML. 

Answers 3

Well, first of all, loadHTML loads from an HTML inside a string. If $tmp_file is the name of the file, you should use loadHTMLFile.

Also, loadHTML is not static, so you need to do $dom->loadHTML($tmp_file);

Now the answer to the question.

What getElementsByTagName() returns is a DOMNodeList. As an object, probably the count() function will just say 1, but DOMNodeList has a property called length. If you query only li elements and then read the length it will give the quantity of li elements.

As a test:

$dom = new DOMDocument(); $dom->loadHTML("<li>test 1</li><li>test 2</li><li>test 3</li><li>test 4</li>"); $count = $dom->getElementsByTagName("li"); echo $count->length; //Prints 4 

Inside the <ul> I've set up four <li> elements.

Answers 4

You were close.

Try this:

$count = $dom->getElementsByTagName("li")->length; 

And change this echo count($count); to echo $count

Answers 5

Could you try something like this? $url being the path to your html file?

$data = file($url); $count = null; foreach($data as $line){     if (strpos($line,'<li')){         ++$count;     } }  echo($count); exit(); 

Answers 6

You may also use :

echo preg_match_all("~<li([^>]*)>~",file_get_contents("your_html_file")).PHP_EOL; 

Test Results :

akshay@db-3325:/tmp$ cat file <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426832/میروسلاو-ژیوکو-سرمربی-تیم-والیبال-سایپا-شد" target="_blank" title="میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد">میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426824/فدرر-از-نظر-فیزیکی-شرایط-سال-قبل-را-ندارم" target="_blank" title="فدرر: از نظر فیزیکی شرایط سال قبل را ندارم">فدرر: از نظر فیزیکی شرایط سال قبل را ندارم</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426817/شکست-تیم-&#171;الف&#187;-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند">شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند</a> </li> <li class="news-video">     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426815/5-حرکت-دیدنی-در-لیگ-تابستان-NBA؛-96-04-21" target="_blank" title="5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21">5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426813/معرفی-هیات-مدیره-جدید-صندوق-حمایت-از-پیشکسوتان" target="_blank" title="معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان">معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426808/رحیمی،-یزدانی-و-قاسمی-در-رده-اول-تا-سوم-جهان" target="_blank" title="رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان">رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان</a> </li> <li >     <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426792/جوکوویچ-منتظر-رویارویی-با-بردیچ-هستم" target="_blank" title="جوکوویچ: منتظر رویارویی با بردیچ هستم">جوکوویچ: منتظر رویارویی با بردیچ هستم</a> </li>   akshay@db-3325:/tmp$ php -r 'echo preg_match_all("~<li([^>]*)>~",file_get_contents("file")).PHP_EOL;' 7 

Answers 7


Tanx a lot For Contributions , appreciated
i was struggling with this issue for almost a month ago , and i did not find a correct answer for that , and about a week ago when my client just asks about that, this problem just pops out as an alert in head, so i decided to handle that a soon as possible and i put bounty on that(50 reputation), after 3 days it is been answered by @Blaise and @FrancisEytanDortort! I personally appreciate this guys and thank them a lot but i solved that about three days ago (sorry about that I forgot to post my answer here, I'm currently working on a very serious project and I just came over to stack overflow when I can), so long story short:
as so stupid i am , my point of that issue was that i just want to achieve that a tags and grab their link, and i just want to use parsing , but some times you should use your intel i9 in your mind and think better, so instead of getting li tags i directly targeted a tags, and it works:
here is the code

$this->dom = new DOMDocument(); @$this->dom->loadHTMLfile($tmp_file); $this->as = $this->dom->getElementsByTagName('a'); foreach($this->as as $a) { ... 

and as each of this items were saved to DB , then i cant get Count of them from DB with mysql queries , That's it !
Thank You

Answers 8

If you are sure all the lines are the same you do not even need to check for the <li> tag. Just do a quick count of the number of lines in the file and divide by 3:

$total_lines = count(file($html_file)); $num_list_items = $total_lines / 3;  

$html_file should just be the path to the file. You do not need to parse the HTML so no need to create a new DOMDocument. This is much more efficient, but only if you know for sure that the entire file is formatted in this way.

Answers 9

You just use the following code for get the li count from html page data

 $html_page_data='<li >             <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426832/میروسلاو-ژیوکو-سرمربی-تیم-والیبال-سایپا-شد" target="_blank" title="میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد">میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد</a>         </li>         <li >             <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426824/فدرر-از-نظر-فیزیکی-شرایط-سال-قبل-را-ندارم" target="_blank" title="فدرر: از نظر فیزیکی شرایط سال قبل را ندارم">فدرر: از نظر فیزیکی شرایط سال قبل را ندارم</a>         </li>         <li >             <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426817/شکست-تیم-&#171;الف&#187;-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند">شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند</a>         </li>';           $doc = new DOMDocument();           $doc->loadHTML($html_page_data);           libxml_clear_errors();           $xpath = new DOMXPath($doc);           $query = '//li'; //query pattern for find li           $li_data= $xpath->query($query);     echo  $li_data->length ; //output 3 

Answers 10

This works for me (putting your example HTML in a file called "index.html"):

<?php $dom = new DOMDocument(); $dom->loadHTMLFile("index.html"); $count = $dom->getElementsByTagName("li"); printf("Count: %d\n", count($count)); 

Edit: Although, as has been said, you can skip the count():

$li_elems = $dom->getElementsByTagName("li"); printf("Count: %d\n", $li_elems->length); 

Answers 11

You can use PHP Simple HTML DOM Parse: http://simplehtmldom.sourceforge.net/

echo count($html->find('li')); 

Answers 12

I can hel you.

You should use this code:

$numberOfListItems= $domElement->getElementsByTagName("li")->length;

$numberOfListItems contains needed value

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment