0

我已经从像这样的 url 中剥离了标签数据

$url='http://abcd.com';
$d=stripslashes(file_get_contents($url));
echo strip_tags($d);

但不幸的是,所有标签值都被组合在一起,就像user14036100 9.00user23034003 11.33user32028000 14.00存储 user1、user2、user3 属性的位置一样,很难分析属性值,因为它们都是由strip_tags().

所以朋友们可以帮我剥离每个标签并存储在一个数组中,或者在每个剥离的标签数据的末尾放置一个分隔符。

提前致谢 :)

4

1 回答 1

1

您无法使用 实现此目的strip_tags(),因为它只是删除了标签。您不想用例如空白字符(换行符、空格、..)替换它们。您可能应该使用正则表达式调用来执行此操作,它只是替换所有标签。

更好的方法是使用DOMDocument解析获取的页面,以便您可以直接从 HTML 结构派生结构。

DOMDocument 的使用示例

您有以下示例 html 页面:

<!DOCTYPE html>
<html>
    <head>
        <title>This is my title</title>
    </head>
    <body>
        <table id="someDataHere">
            <tr>
                <th>Country</th>
                <th>Population</th>
            </tr>

            <tr>
                <td>Germany</td>
                <td>81,779,600</td>
            </tr>

            <tr>
                <td>Belgium</td>
                <td>11,007,020</td>
            </tr>

            <tr>
                <td>Netherlands</td>
                <td>16,847,007</td>
            </tr>

        </table>
    </body>
</html> 

您可以使用DOMDocument来获取表中的条目:

$url = "...";
$dom = new DOMDocument("1.0", "UTF-8");
$dom->loadHTML(file_get_contents($url));

$preparedData = array();
$table = $dom->getElementById("someDataHere");
$tableRows = $table->getElementsByTagName('tr');

foreach ($tableRows as $tableRow)
{
    $columns = $tableRow->getElementsByTagName('td');

    // skip the header row of the table - it has no <td>, just <th>
    if (0 == $columns->length)
    {
        continue;
    }

    $preparedData[ $columns->item(0)->nodeValue ] = $columns->item(1)->nodeValue;
}

$preparedData现在将保存以下数据:

Array
(
    [Germany] => 81,779,600
    [Belgium] => 11,007,020
    [Netherlands] => 16,847,007
)

一些笔记

  • 由于您正在开发爬虫(蜘蛛),因此您高度依赖目标网页的 HTML 结构。每当他们更改模板中的某些内容时,您可能必须调整您的爬虫。
  • 这只是一个简单的示例,但它应该清楚说明您现在如何使用它来产生更高级的结果。
  • 由于DOMDocument实现了 DOM 方法,因此您必须使用它们提供的可能性来处理 HTML 结构。
  • 对于非常大的 HTML 页面DOMDocument,在内存方面可能会变得非常昂贵。
于 2012-02-22T11:02:21.007 回答