【问题标题】:Read data from HTML table with PHP使用 PHP 从 HTML 表中读取数据
【发布时间】:2012-05-28 04:44:42
【问题描述】:

最近我有一个问题,我想做的是从 HTML 表中读取数据并将数据抓取到一个名为 $id 的变量中。例如我有这个代码:

<tr>
<td>413</td>
<td>Party Hat</td>
<td>0</td>
<td>No</td>
<td><a href="http://clubpenguincheatsnow.com/tools/swfviewer/items.swf?id=413">View SWF</a></td>
</tr>

我想要做的是另一个名为$array[$i] 的变量正在保存一个搜索查询。我希望我的 PHP 代码在表格中搜索,直到找到包含特定查询的部分。在这种情况下是“派对帽”。我希望它在找到查询后做的是查看 ID,它是名称“Party Hat”上方的“td”部分,在这种情况下,ID 是 413。在此之后,我希望变量 $id拿着身份证。我该怎么做呢?任何帮助将不胜感激!

【问题讨论】:

标签: php html web-scraping html-table scripting


【解决方案1】:

使用TidyDOMDocumentDOMXPath(确保启用了 PHP 扩展)您可以执行以下操作:

<?php
$url = "http://example.org/test.html";

function get_data_from_table($id, $url)
{
    // retrieve the content of that url
    $content = file_get_contents($url);

    // repair bad HTML
    $tidy = tidy_parse_string($content);
    $tidy->cleanRepair();
    $content = (string)$tidy;

    // load into DOM
    $dom = new DOMDocument();
    $dom->loadHTML($content);

    // make xpath-able
    $xpath = new DOMXPath($dom);

    // search for the first td of each tr, where its content is $id
    $query = "//tr/td[position()=1 and normalize-space(text())='$id']";
    $elements = $xpath->query($query);
    if ($elements->length != 1) {
        // not exactly 1 result as expected? return number of hits
        return $elements->length;
    }

    // our td was found
    $element = $elements->item(0);

    // get his parent element (tr)
    $tr = $element->parentNode;
    $data = array();

    // iterate over it's td elements
    foreach ($tr->getElementsByTagName("td") as $td) {
        // retrieve the content as text
        $data[] = $td->textContent;
    }

    // return the array of <td> contents
    return $data;
}

echo '<pre>';
print_r(
    get_data_from_table(
        414,
        $url
    )
);
echo '</pre>';

您的 HTML 源代码 (http://example.org/test.html):

<table><tr>
<td>413</td>
<td>Party Hat</td>
<td>0</td>
<td>No</td>
<td><a href="http://clubpenguincheatsnow.com/tools/swfviewer/items.swf?id=413">View SWF</a></td>
</tr><tr>
<td>414</td>
<td>Party Hat</td>
<td>0</td>
<td>No</td>
<td><a href="http://clubpenguincheatsnow.com/tools/swfviewer/items.swf?id=413">View SWF</a></td>
</tr>

(如您所见,没有有效的 HTML,但这没关系)

【讨论】:

    【解决方案2】:

    这行得通:(虽然有点难看,也许其他人可以想出更好的xpath解决方案)

    $html = <<<HTML
    <html>
        <body>
            <table>
                <thead>
                    <tr>
                        <td>id</td>
                        <td>name</td>
                        <td>a</td>
                        <td>b</td>
                        <td>c</td>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>413</td>
                        <td>Party Hat</td>
                        <td>0</td>
                        <td>No</td>
                        <td>a link</td>
                    </tr>
                    <tr>
                        <td>414</td>
                        <td>Party Hat 2</td>
                        <td>0</td>
                        <td>No</td>
                        <td>a link</td>
                    </tr>
                </tbody>
            </table>
        </body>
    </html>
    HTML;
    
    $doc = new DOMDocument();
    $doc->loadHTML($html);
    $domxpath = new DOMXPath($doc);
    
    $res = $domxpath->query("//*[local-name() = 'td'][text() = 'Party Hat']/../td[position() = '1']");
    
    var_dump($res->length, $res->item(0)->textContent);
    

    输出:

    int(1)
    字符串(3)“413”

    【讨论】:

      【解决方案3】:

      尝试通过 loadHTML 将 html 加载到新的 DOMDocument 中,并像 XML Doc 一样使用 xpath 或其他类型的查询来处理它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多