使用 php 从 html 文件中计算 li 项
Posted
技术标签:
【中文标题】使用 php 从 html 文件中计算 li 项【英文标题】:Counting li items from a html file using php 【发布时间】:2017-12-16 13:00:05 【问题描述】:我有一个 html 文件,其中包含许多 JUST “li”标签,没有 head 和 body 标签以及其他任何东西。我想用 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/شکست-تیم-«الف»-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم «الف» والیبال ساحلی ایران مقابل هلند">شکست تیم «الف» والیبال ساحلی ایران مقابل هلند</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>
【问题讨论】:
你能粘贴一些它正在查看的 html 吗? 和其他许多类似的 li 标签... 请使用任何其他信息/代码更新您的问题,而不是在评论中。 它返回“1”,因为它返回为真。 请检查您的错误日志(或者更好的是,打开显示错误,方法如下:***.com/questions/5438060/…)并检查您在尝试解析内容时是否收到一堆警告。 【参考方案1】:你已经接近了。我认为您正在寻找的是以下内容:
$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
属性包含找到的节点数。
你可以试试代码here。
这种 DOM 解析 方法比字符串或正则表达式搜索更可取,因为它旨在说明 HTML 可以被接受的许多可变编写方式(即不一致的间距、属性顺序)。
【讨论】:
如上所述,长度不起作用,它应该是长度(),顺便说一句,thanx man,我会尽快将我的答案发布给她 它确实应该是->length
而不是->length()
,因为length
是DOMNodeList
的属性,而不是方法,和属性在没有括号的情况下访问。如果您仍然没有得到所需的输出,那么问题出在其他地方,可能是使用loadHTML()
而不是loadHTMLFile()
?【参考方案2】:
您可以在该字符串上为<li>
(或-li-)执行一个非常简单的Substring Count
,它将返回项目数。
见这里:function.substr-count
$count = substr_count($html,'<li>'); //where $html holds your piece of HTML.
【讨论】:
仍然返回 0 在 OP 在评论中发布的示例中,它实际上是<li >
(有一个额外的空格)。
还是零哥们(有额外空间)!
当我尝试使用您问题中的 HTML 时,@Er.Ellison substr_count($html,'<li >');
非常适合我。当然,您需要将$html
更改为实际保存您的HTML 数据的变量。试试看:3v4l.org/daX97
如果你打算走这条路,我建议检查</li>
或<li
这样你就可以避免担心标签中的额外空间/属性。【参考方案3】:
你很亲密。
试试这个:
$count = $dom->getElementsByTagName("li")->length;
并将此 echo count($count);
更改为 echo $count
【讨论】:
它不识别长度 对不起,是->length
。
这很有趣,
这次返回 0 :))))))
@Er.Ellison 请查看我对您的问题的评论。【参考方案4】:
首先,loadHTML 从字符串中的 HTML 加载。如果 $tmp_file 是文件名,你应该使用 loadHTMLFile。
另外,loadHTML 不是静态的,所以你需要做$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>
元素。
【讨论】:
$tmp_file 正在从链接中检索数据并使用 file_put_contents 将其放入 tmp 文件,所以,到目前为止,我有一个 html 文件,其中只包含“li”标签(即使我尝试过在浏览器中加载 tmp 文件,它只是向我显示了一些疯狂的字符),它没有任何 body 或 html 标签 @Er.Ellison 没关系,这只是一个例子。您只能放置<li>
标签并且它可以工作。我会改变我的例子来反映你的情况。
相信我,我正在尝试如你所说,但它返回 0 ,这是返回结果:
你首先看到的是 echo $count->length 的结果中的零;
你能发布echo $tmp_file;
显示的内容吗?只是为了丢弃东西。另外,你在用$dom->loadHTML()
吗?【参考方案5】:
你能试试这样的吗? $url
是您的 html 文件的路径?
$data = file($url);
$count = null;
foreach($data as $line)
if (strpos($line,'<li'))
++$count;
echo($count);
exit();
【讨论】:
不,兄弟,我认为您的回答中有错字,在'',感谢您回答我的问题,我已经用另一种天才的方式解决了这个问题,对此感到抱歉我忘了在这里发布我的答案,我目前正在做一个非常严肃的项目,我只是在可能的时候过来堆栈溢出,顺便说一句,首先感谢 Blaise(我的男人),其次,我'我会尽快在这里发布我的答案!非常感谢你们! 哈哈!很高兴你找到了答案。由于代码中的空格,我故意省略了开始 标记的关闭!【参考方案6】:如果您确定所有行都相同,您甚至不需要检查<li>
标记。只需快速计算文件中的行数并除以 3:
$total_lines = count(file($html_file));
$num_list_items = $total_lines / 3;
$html_file 应该只是文件的路径。您无需解析 HTML,因此无需创建新的 DOMDocument。这样效率更高,但前提是您确定整个文件都以这种方式格式化。
【讨论】:
【参考方案7】:您只需使用以下代码从 html 页面数据中获取 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/شکست-تیم-«الف»-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم «الف» والیبال ساحلی ایران مقابل هلند">شکست تیم «الف» والیبال ساحلی ایران مقابل هلند</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
【讨论】:
【参考方案8】:你也可以使用:
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/شکست-تیم-«الف»-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم «الف» والیبال ساحلی ایران مقابل هلند">شکست تیم «الف» والیبال ساحلی ایران مقابل هلند</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
【讨论】:
【参考方案9】:这对我有用(将您的示例 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);
【讨论】:
【参考方案10】:您可以使用 PHP Simple HTML DOM Parse: http://simplehtmldom.sourceforge.net/
echo count($html->find('li'));
【讨论】:
如果正确,请检查为正确答案)))【参考方案11】:我可以帮你。
你应该使用这个代码:
$numberOfListItems= $domElement->getElementsByTagName("li")->length;
$numberOfListItems 包含所需的值
【讨论】:
【参考方案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 查询从数据库中获取它们的数量,就是这样!
【讨论】:
以上是关于使用 php 从 html 文件中计算 li 项的主要内容,如果未能解决你的问题,请参考以下文章