मेरे पास एक HTML फ़ाइल है जिसमें बहुत से जस्ट "ली" टैग हैं जिनमें कोई हेड और बॉडी टैग नहीं है और कुछ भी है। मैं उन्हें PHP का उपयोग करके गिनना चाहता हूं। मैं यह कैसे कर सकता हूं?

हालांकि, मैंने यह कोशिश की:

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

लेकिन यह 1 लौटाता है।

यहां $tmp_file है (मुझे नहीं पता कि उनमें से कितने पुनर्प्राप्त किए जाएंगे (उनमें से सौ हो सकते हैं) लेकिन मैं उनमें से केवल 5 को यहां जोड़ता हूं):

<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>
11
a_m_dev 12 जुलाई 2017, 11:07

12 जवाब

सबसे बढ़िया उत्तर

उस मुद्दे का मुद्दा यह था कि मैं सिर्फ एक टैग हासिल करना चाहता हूं और उनके लिंक को पकड़ना चाहता हूं, और मैं सिर्फ पार्सिंग का उपयोग करना चाहता हूं, लेकिन कभी-कभी आपको अपने इंटेल i9 का उपयोग अपने दिमाग में करना चाहिए और बेहतर सोचना चाहिए, इसलिए <li> टैग मैंने सीधे <a> टैग को लक्षित किया, और यह काम करता है:

यहाँ कोड है:

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

और चूंकि इनमें से प्रत्येक आइटम डेटाबेस में सहेजा गया था, तो मैं डेटाबेस से MySQL प्रश्नों के साथ उनकी गिनती नहीं कर सकता, बस!

2
halfer 5 अगस्त 2018, 22:03

तुम करीब हो। मुझे लगता है कि आप जो खोज रहे हैं वह निम्नलिखित है:

$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;

$tmp_file के आपके मूल्य के आधार पर आप या तो loadHTML()का उपयोग करेंगे अगर इसमें वास्तविक सामग्री है, या loadHTMLFile() यदि इसमें फ़ाइल नाम है। (ध्यान दें कि इन विधियों को स्थिर रूप से नहीं कहा जाना चाहिए।)

विधि getElementsByTagName() एक DOMNodeList एक length प्रॉपर्टी के साथ ऑब्जेक्ट जिसमें पाए गए नोड्स की संख्या है।

आप यहां कोड आज़मा सकते हैं।

यह DOM पार्सिंग दृष्टिकोण स्ट्रिंग या रेगुलर एक्सप्रेशन खोजों के लिए बेहतर है क्योंकि इसे HTML को स्वीकार्य रूप से लिखे जाने वाले कई चर तरीकों (यानी असंगत रिक्ति, विशेषता क्रम) के लिए डिज़ाइन किया गया है।

8
Francis Eytan Dortort 12 सितंबर 2017, 03:48

आप उस स्ट्रिंग पर <li> (या -li-) के लिए एक बहुत ही सरल Substring Count कर सकते हैं और यह आइटमों की संख्या लौटाएगा। यहां देखें: function.substr-count

$count = substr_count($html,'<li>'); //where $html holds your piece of HTML.
6
ankit suthar 16 सितंबर 2017, 12:15

आप करीब थे।

ये कोशिश करें:

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

और इसे echo count($count); से echo $count में बदलें

4
J Shubham 12 जुलाई 2017, 11:52

ठीक है, सबसे पहले, लोड HTML एक स्ट्रिंग के अंदर एक HTML से लोड होता है। यदि $tmp_file फ़ाइल का नाम है, तो आपको loadHTMLFile का उपयोग करना चाहिए।

साथ ही, लोडएचटीएमएल स्थिर नहीं है, इसलिए आपको $dom->loadHTML($tmp_file); करने की आवश्यकता है

अब सवाल का जवाब।

क्या getElementsByTagName() रिटर्न एक DOMNodeList है। एक वस्तु के रूप में, शायद count() फ़ंक्शन केवल 1 कहेगा, लेकिन DOMNodeList में length नामक एक संपत्ति है। यदि आप केवल li तत्वों को क्वेरी करते हैं और फिर length पढ़ते हैं तो यह li तत्वों की मात्रा देगा।

एक परीक्षण के रूप में:

$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

<ul> के अंदर मैंने चार <li> एलिमेंट सेट किए हैं।

3
Alex Ruiz 12 जुलाई 2017, 11:26

क्या आप ऐसा कुछ करने की कोशिश कर सकते हैं? $url आपकी html फ़ाइल का पथ है?

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

echo($count);
exit();
3
Blaise 12 सितंबर 2017, 00:21

यदि आप सुनिश्चित हैं कि सभी लाइनें समान हैं, तो आपको <li> टैग की जांच करने की भी आवश्यकता नहीं है। बस फ़ाइल में पंक्तियों की संख्या की एक त्वरित गणना करें और 3 से विभाजित करें:

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

$html_file फ़ाइल का पथ होना चाहिए। आपको HTML को पार्स करने की आवश्यकता नहीं है, इसलिए कोई नया DOMDocument बनाने की आवश्यकता नहीं है। यह बहुत अधिक कुशल है, लेकिन केवल तभी जब आप सुनिश्चित रूप से जानते हों कि पूरी फ़ाइल इस तरह से स्वरूपित है।

3
kojow7 13 सितंबर 2017, 07:35

एचटीएमएल पेज डेटा से li गिनती प्राप्त करने के लिए आप बस निम्न कोड का उपयोग करें

 $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
3
karthikeyan ganesan 13 सितंबर 2017, 22:52

आप भी उपयोग कर सकते हैं:

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

परीक्षा के परिणाम :

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
3
Akshay Hegde 13 सितंबर 2017, 22:54

यह मेरे लिए काम करता है (अपना उदाहरण HTML को "index.html" नामक फ़ाइल में डालकर):

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

संपादित करें: हालांकि, जैसा कि कहा गया है, आप count() को छोड़ सकते हैं:

$li_elems = $dom->getElementsByTagName("li");
printf("Count: %d\n", $li_elems->length);
3
klumme 14 सितंबर 2017, 12:00

आप PHP सरल HTML डोम पार्स का उपयोग कर सकते हैं: http://simplehtmldom.sourceforge.net/

echo count($html->find('li'));
2
Salim Ibrogimov 14 सितंबर 2017, 13:30

मैं आपकी मदद कर सकता हूं।

आपको इस कोड का उपयोग करना चाहिए:

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

$numberOfListItems में आवश्यक मान शामिल है

2
Dmitriy Buteiko 15 सितंबर 2017, 11:40