在PHP

时间:2015-11-12 22:30:56

标签: php dom xpath domdocument

我真的很想通过XPath或任何类型的'getElement'方法来搜索表。我已经四处寻找并尝试了各种不同的方法来解决我的问题,但是我已经做了简短的事情并非常感谢任何帮助。

首先,我试图抓取的HTML部分是文档中的第二个表格,如下所示:

<table class="table2" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr><th colspan="8" align="left">Status Information</th></tr>
<tr><th align="left">Status</th><th align="left">Type</th><th align="left">Address</th><th align="left">LP</th><th align="left">Agent Info</th><th align="left">Agent Email</th><th align="left">Phone</th><th align="center">Email Tmplt</th></tr>
<tr></tr>
<tr>
<td align="left">Active</td>
<td align="left">Resale</td>
<td align="center">*Property Address*</td>
<td align="right">*Price*</td>
<td align="center">*Agent Info*</td>
<td align="center">*Agent Email*</td>
<td align="center">*Agent Phone*</td>
<td align="center">&nbsp;</td>
</tr>
<tr>
<td align="left">Active</td>
<td align="left">Resale</td>
<td align="center">*Property Address*</td>
<td align="right">*Price*</td>
<td align="center">*Agent Info*</td>
<td align="center">*Agent Email*</td>
<td align="center">*Agent Phone*</td>
<td align="center">&nbsp;</td>
</tr>
...etc

其他trs继续包含8个tds,其信息与上述相同。

我需要做的是遍历trs和内部tds以获取每个条目(在tr内部)的每条信息(在td内)。

以下是我一直在努力的代码:

<?php

$payload = array(
  'http'=>array(
     'method'=>"POST",
     'content'=>'key=value'
   )
);
stream_context_set_default($payload);
$dom = new DOMDocument();
libxml_use_internal_errors(TRUE);
$dom->loadHTMLFile('website-scraping-from.com');
libxml_clear_errors();

foreach ($dom->getElementsByTagName('tr') as $row){
    foreach($dom->$row->getElementsByTagName('td') as $node){
        echo $node->textContent . "<br/>";
    }

}


?>

这段代码几乎没有返回我需要的东西,我在尝试弄清楚如何解决它时遇到了很多麻烦,也许XPath是一个更好的途径去寻找我需要的表/信息,但我来了这个方法也空了。非常感谢任何信息。

如果重要,我的最终目标是能够获取表数据并将其转储到数据库中,如果第一个td的值为“Active”。

1 个答案:

答案 0 :(得分:1)

这可以提供任何帮助吗?

list(e for e in flat(lst))[12]
>>> 'm'

这将获取第二个表,并显示以第一个单元格开头的行的内容&#34; Active&#34;。

修改:这是一个更广泛的帮助:

$table = $dom->getElementsByTagName('table')->item(1);
foreach ($table->getElementsByTagName('tr') as $row){
    $cells = $row->getElementsByTagName('td');
    if ( $cells->item(0)->nodeValue == 'Active' ) {
        foreach($cells as $node){
            echo $node->nodeValue . "<br/>";
        }
    }
}