从外部文件 php 获取 Div


Get Div from external file php

我正在尝试从外部链接从div类获取信息我该怎么做?

<div class="item-list"><h3>répartitions des gains</h3><ul id="partages" class="partages-gain"><li class="partage_header first"><div class="part_label">Combinez :</div><div class="num_gain">Nombre de gains</div><div class="lots">Lot (Rs)</div></li>
<li class="partage_number"><div class="part_label">6 des 6</div><div class="num_gain">0</div><div class="lots">0</div></li>
<li class="partage_number"><div class="part_label">5 des 6</div><div class="num_gain">59</div><div class="lots">11 776</div></li>
<li class="partage_number"><div class="part_label">4 des 6</div><div class="num_gain">3 093</div><div class="lots">463</div></li>
<li class="partage_number"><div class="part_label">3 des 6</div><div class="num_gain">48 021</div><div class="lots">100</div></li>
<li class="partage_total last"><div class="part_label">Total</div><div class="num_gain">51 173</div><div class="lots">6 928 943</div></li>
</ul></div>  </div>

以上是外部链接源代码例如,我试图在num_gain中获取0但是有5 num_gain类并将其存储到变量中,然后将其发送到我的数据库。

您可以使用 DOMDocument 和 DOMXpath 来执行此操作 我写了这个函数,用于从返回数组的类名中获取内容

function getContentByClassName($html, $classname) {
     $content = array();
     $dom = new DomDocument();
     @$dom->loadHTML($html);
     $finder = new DomXPath($dom);
     $nodes = $finder->query("//*[contains(@class, '$classname')]");
     foreach($nodes as $node){
        $content[] = $node->nodeValue;
     }
     return $content;
}

用法

$html = file_get_contents('your external link');
$class = 'num_gain';
var_dump(getContentByClassName($html, $class));

输出

array (size=6)
  0 => 'Nombre de gains' 
  1 => '0' 
  2 => '59'
  3 => '3 093'
  4 => '48 021'
  5 => '51 173'

我不确定您的问题是关于提取一个数值还是多个关于类名"num_gain"的div 标签的数值。因此,我为每种可能性提供一个答案,如下所示:

如果您希望在"num_gain"div 标签中提取零,我建议使用以下代码:

<?php
$html = file_get_contents("http://www.example.com/page_with_divs.html");
preg_match("/class='"num_gain'">([0-9])<'//",$html,$matches);
$result = $matches[1]; // 0

请注意,变量赋值是可选的。我赞成它主要是为了代码的易读性。

代码将 preg_match() 与正则表达式一起使用。 正则表达式模式排除与第一个num_gain DIV 的匹配,因为它包含非数字数据,即"Nombre de gains"。该模式确实与下一个指定的 DIV 标记匹配,因为它的文本由一个数字组成,即零。

如果执行 $matches 的 var_dump() ,则会产生以下结果:

  array (size=2)
    0 => string 'class="num_gain">0</' (length=20)
    1 => string '0' (length=1)

第 0 个元素包含与正则表达式模式完全匹配的字符串,而下一个元素包含借助括号"记住"的模式部分。 因此,$matches[1]包含要存储在数据库中的所需值。

如果您的问题实际上与访问类 DIV 标签中的数字数据有关num_gain那么您可以编写以下代码来使用 preg_match_all()

<?php
$html = file_get_contents("http://www.example.com/page_with_divs.html");
preg_match_all("/class='"num_gain'">([0-9][0-9 ]*)<'//",$html,$matches);

matches[1]现在包含以下数组:

array (
  0 => '0',
  1 => '59',
  2 => '3 093',
  3 => '48 021',
  4 => '51 173',
)

需要注意的是,虽然网络抓取在技术上很容易做到,但您应该确保此活动在法律上是允许的。