Php 用DOM方式解析HTML

Php 用DOM方式解析HTML,php,dom,xpath,Php,Dom,Xpath,我们有一个古老的(内部)静态信息网站。我们将用更好的东西替换它,因此我需要获取所有信息。我以前是通过正则表达式来实现这一点的,但最近我偶然发现了一些文章,其中指出使用正则表达式来解析HTML中的信息是非常困难的 所以我决定学习一些新技巧,重新开始,用DOM的方式来做。 我需要的HTML部分如下所示: <table id="articles"> <tr> <th> <a href='articles/aa123.html'&

我们有一个古老的(内部)静态信息网站。我们将用更好的东西替换它,因此我需要获取所有信息。我以前是通过正则表达式来实现这一点的,但最近我偶然发现了一些文章,其中指出使用正则表达式来解析HTML中的信息是非常困难的

所以我决定学习一些新技巧,重新开始,用DOM的方式来做。 我需要的HTML部分如下所示:

<table id="articles">
    <tr>
    <th>
        <a href='articles/aa123.html'><img src="/iamges/aa123.jpg" alt="some article"></a>
        <br />short description
    </th>
    <td>
        <table class='details'>
        <tr><th><a href='articles/aa123.html'>Some Article</a></th></tr>
        <tr><th>Type:</th><td>article type</td></tr>
        <tr><th>Price:</th><td>€ 99</td></tr>
        <tr><th>Manufacturer:</th><td>Some Company</td></tr>
        <tr><th>Warehouse:</th><td>x</td></tr>
        </table>
    </td>
</tr>   
</table>
这就是我被困的地方。我知道返回的TH的所有内容都在ChildNodes中,但我很难获得值。我需要详细信息页面的URL和价格列的值

我怎样才能把这些提取出来

目前,我提出了以下建议:

$query = '//table[@class="details"]//td';
$data= $xpath->evaluate($query);
$c = $ths->length;

for ($i = 0; $i < $c; $i++) {   
    echo htmlentities($data->item($i)->nodeValue);      
}
$tables = $xpath->query('//table[@class="details"]');
foreach($tables as $table) {
    $url = $xpath->evaluate('//th/a/@href', $table);
    $articleName= $xpath->evaluate('//th/a', $table);
    $Manufacturer= $xpath->evaluate('//th[text()="Manufacturer:"]/../td', $table);

    echo 'articleName:' . $articleName . ' <br />';
    echo 'Manufacturer:' . $Manufacturer. ' <br />';
    echo 'url:' . $url. ' <br />';
    echo '<br />';
}
$query='//table[@class=“details”]//td';
$data=$xpath->evaluate($query);
$c=$ths->长度;
对于($i=0;$i<$c;$i++){
echo htmlentities($data->item($i)->nodeValue);
}
但这只显示来自TD的文本值。当内容是链接时,它只显示链接标题。不是URL

更新 多亏了Fab的建议,我设法预订了一些进度表。目前我得到了以下信息:

$query = '//table[@class="details"]//td';
$data= $xpath->evaluate($query);
$c = $ths->length;

for ($i = 0; $i < $c; $i++) {   
    echo htmlentities($data->item($i)->nodeValue);      
}
$tables = $xpath->query('//table[@class="details"]');
foreach($tables as $table) {
    $url = $xpath->evaluate('//th/a/@href', $table);
    $articleName= $xpath->evaluate('//th/a', $table);
    $Manufacturer= $xpath->evaluate('//th[text()="Manufacturer:"]/../td', $table);

    echo 'articleName:' . $articleName . ' <br />';
    echo 'Manufacturer:' . $Manufacturer. ' <br />';
    echo 'url:' . $url. ' <br />';
    echo '<br />';
}
$tables=$xpath->query('//table[@class=“details”]');
foreach($tables作为$table){
$url=$xpath->evaluate('//th/a/@href',$table);
$articleName=$xpath->evaluate('//th/a',$table);
$Manufacturer=$xpath->evaluate(“//th[text()=”Manufacturer:”]/../td',$table);
回显“articleName:”.$articleName.
; 回显“制造商:”.$Manufacturer.“
”; 回显“url:”.$url.
; 回声“
”; }

但由于某些原因,它总是显示第一次活动的数据(重复的文章数量与页面上的文章数量相同)。好像“foreach”语句总是返回找到的第一个表。任何提示?

URL的XPath将是:

//table[@class="details"]//th/a@href
对于价格栏:

//table[@class="details"]//th[text()="Price:"]/../td
您可能希望分别获取每个表的URL和价格,为此,您可以首先收集一个包含所有“详细信息”表的
DOMNodeList
,然后在其中搜索(使用上下文参数):


谢谢我会尝试一下(我一直专注于在1查询中获取所有信息,我将如何使用regex)我取得了一些进展,但仍然缺少一些东西。。请看我的更新上面。宾果!非常感谢(+phpsandbox站点也是一个很好的提示;o)一个额外的小问题:为什么url值存储在'value'键中,而其他值存储在'nodevalue'键中?区别是什么?URL位于一个属性(
DOMAttr
)中,该属性有一个值,其他的是元素的内部文本(
DOMElement
)。实际上,属性也是节点,它们的节点值等于它们的值,因此您也可以在任何地方使用
nodeValue
$xpath->query(...)->item(0)->nodeValue;