【问题标题】:Scrape DOMDocument Table for Contents in PHP在 PHP 中为内容抓取 DOMDocument 表
【发布时间】:2016-02-14 10:33:50
【问题描述】:

我真的很难通过 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”,我的最终目标是能够获取表数据并将其转储到数据库中。

【问题讨论】:

  • foreach ($dom-&gt;getElementsByTagName('tr') as $row){ foreach($row-&gt;getElementsByTagName('td') as $node){ echo $node-&gt;textContent . "&lt;br/&gt;"; } } 刚刚编辑了第二个 foreach...

标签: php dom xpath domdocument


【解决方案1】:

这有什么帮助吗?

$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/>";
        }
    }
}

这将获取第二个表,并显示从第一个单元格“活动”开始的行的内容。

编辑:这里有更广泛的帮助:

$arr = array();
$table = $dom->getElementsByTagName('table')->item(1);
foreach ($table->getElementsByTagName('tr') as $row){
    $cells = $row->getElementsByTagName('td');
    if ( $cells->item(0)->nodeValue == 'Active' ) {
        $obj = new stdClass;
        $obj->type    = $cells->item(1)->nodeValue;
        $obj->address = $cells->item(2)->nodeValue;
        $obj->price   = $cells->item(3)->nodeValue;
        $obj->agent   = $cells->item(4)->nodeValue;
        $obj->email   = $cells->item(5)->nodeValue;
        $obj->phone   = $cells->item(6)->nodeValue;
        array_push( $arr, $obj );
    }
}
print_r( $arr );

【讨论】:

  • 我认为这正是我所需要的,如果我理解正确的话“->item(1)”会让我找到在 DOM 中找到的第二个 (0,1) 表标签?对不起,这对我来说是全新的,从来没有做过这样的事情。
  • 是的!项目从 0、1、2 等开始计数!
  • 伙计,非常感谢您的帮助,我想我已经完全按照自己的意愿进行操作了。打算用它做更多的工作,然后我会把它标记为答案。我非常感谢。
猜你喜欢
  • 1970-01-01
  • 2020-07-22
  • 2017-11-26
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多