在PHP中抓取HTML的东西

时间:2017-10-05 06:38:42

标签: php html mysql

这是我的问题,我有许多表,tr和td的html文件。我已经从DOM的特定领域获得特定价值。但是我希望得到所有的价值,如果条件像我做的那样没有许多,因为每个表都有不同的位置字段td。我想在 Dimension:之后得到值,所以虽然每个表都有不同的位置字段td可以获得该值。你可以给出像使用正则表达式的解决方案来获得特定的价值。如果100个表格和维度: td位置如何在不同的位置,如果条件,它会产生很多。我希望你能得到我说的话。抱歉,我的英文。这是我的代码和输出如下。这个只是一点代码。

表:

<HTML>
<BODY>
<TABLE class="tab1" border="1" cellpadding="0" cellspacing="0" summary="">
<TR>
<TH align=left colspan=2 bgcolor=#0066CC><H1> &nbsp;Start RIP Job</H1>
</TH>
</TR>
<TR>
<TH align=left> &nbsp; &nbsp;Printer:
</TH>
<TD class="td1" align=left> &nbsp; &nbsp;RunJiang Flora 3204P&nbsp; &nbsp;
</TD>
</TR>
<TR>
<TH align=left> &nbsp; &nbsp;File:
</TH>
<TD class="td1" align=left> &nbsp; &nbsp;8iG6e8r5T.png&nbsp; &nbsp;
</TD>
</TR>

<TH align=left> &nbsp; &nbsp;Dimensions:
</TH>
<TD class="td1" align=left> &nbsp; &nbsp;39.2 x 38.8cm&nbsp; &nbsp;
</TD>
</TR>
</TABLE>
</BODY>
</HTML>

另一张表:

<HTML>
<BODY>
<TABLE class="tab1" border="1" cellpadding="0" cellspacing="0" summary="">
<TR>
<TH align=left colspan=2 bgcolor=#0066CC><H1> &nbsp;Start Printing</H1>
</TH>
</TR>
<TR>
<TH align=left> &nbsp; &nbsp;Printer:
</TH>
<TD class="td1" align=left> &nbsp; &nbsp;RunJiang &nbsp; &nbsp;
</TD>
</TR>
<TR>
<TH align=left> &nbsp; &nbsp;File:
</TH>
<TD class="td1" align=left> &nbsp; &nbsp;8.png&nbsp; &nbsp;
</TD>
</TR>
 <TR>
<TH align=left> &nbsp; &nbsp;Resolution:
</TH>
<TD class="td1" align=left> &nbsp; &nbsp;39.2 x 38.8cm&nbsp; &nbsp;
</TD>
</TR>
<TR>
<TH align=left> &nbsp; &nbsp;Dimension:
</TH>
<TD class="td1" align=left> &nbsp; &nbsp;29.2 x 28.8cm&nbsp; &nbsp;
</TD>
</TR>
</TABLE>
</BODY>
</HTML>

代码:

$source=file_get_contents("C://xampp/htdocs/Champion/machine-
logs/LogCampusHTML/CPSITES.HTML");
$dom = new DOMDocument();

$dom->loadHTML($source);
$rows = $dom->getElementsByTagName("table");
 $a = "Start RIP Job.....";
 $length = strlen($a);
 $b = "Start Printing.....";
 $length1 = strlen($b);

foreach ($rows as $ala) {
$pjg = $ala->getElementsByTagName("td");
    $tes = $pjg->length;
    $rs = $head->length;
    $ben = $ala->getElementsByTagName('th')->item(0)->textContent;
    $length2 = strlen($ben);

$satu=  $ala->getElementsByTagName('th')->item(0)->textContent;
$dua= $ala->getElementsByTagName('td')->item(0)->textContent;
$tiga= $ala->getElementsByTagName('td')->item(1)->textContent;

if($length2 == $length){
$empat= $ala->getElementsByTagName('td')->item(4)->textContent;
}else if($length2 == $length1){
$empat= $ala->getElementsByTagName('td')->item(3)->textContent;
 }
}
echo $dua;
echo $tiga;
echo $empat;

输出:

RunJiang Flora

8iG6e8r5T.png

39.2 x 38.8cm

润江

8.png

29.2 x 28.8cm

1 个答案:

答案 0 :(得分:1)

使用XPath,您可以选择与文档中的其他内容相关的内容。所以没有循环或ifs ......

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

$source=file_get_contents("NewFile.html");
$dom = new DOMDocument();

$dom->loadHTML($source);
print_r($dom);
$xp = new DOMXPath($dom);

$textList = $xp->query("//th[contains(text(),'Printer')]/../td/text()");
foreach ( $textList as $text )  {
    echo "Text=".$text->nodeValue.PHP_EOL;
}

此代码检索Printer标签后的数据。 XPath查找<th>标记,其中包含包含Printer的文本,然后返回到某个级别(到<tr>),然后返回到<td>字段并返回文本。

相同的逻辑可以应用于任何其他th / td组合。虽然它确实假设数据是该tr中唯一的td标记,但如果是这种情况则应该这样做。

编辑: 要将循环次数和组数据限制在一起,另一种方法是......

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

$source=file_get_contents("NewFile.html");
$dom = new DOMDocument();

$dom->loadHTML($source);
$xp = new DOMXPath($dom);

$textList = $xp->query("//table[//th[contains(text(),'Printer:')]]");
foreach ( $textList as $text )  {
    $printer = $xp->evaluate(
            "string(descendant::tr[th[contains(text(),'Printer')]]/td/text())",
            $text);
    echo "printer=".$printer.PHP_EOL;
    $dimension = $xp->evaluate(
            "string(descendant::tr[th[contains(text(),'Dimensions')]]/td/text())",
            $text);
    echo "Dimensions=".$dimension.PHP_EOL;
}

这只为每个表中都有一个循环,其中包含一个“Printer”元素,对于每个表,它为你后面的每个字段提取值。