简单的HTML DOM没有找到DIV

时间:2013-12-31 14:57:47

标签: php html dom

我有代码尝试从机器人事件页面here is an example中提取事件SKU。我正在使用的代码在页面上找不到任何SKU。 SKU在411号线上,有一个“product-sku”类的div。我的代码没有事件在页面上找到Div,只是下载所有事件。这是我的代码:

<?php
require('simple_html_dom.php');
$html = new simple_html_dom();
if(!$events)
{
    echo mysqli_error($con);
}
while($event = mysqli_fetch_row($events))
{
    $htmldown = file_get_html($event[4]);
    $html->load($htmldown);
    echo "Downloaded";
    foreach ($html->find('div[class=product-sku]') as $row) {
       $sku = $row->plaintext;
       echo $sku;
    }
}
?>

任何人都可以帮我修复我的代码吗?

3 个答案:

答案 0 :(得分:1)

此代码使用DOMDocument php类。它适用于以下示例HTML。请尝试此代码。

// new dom object
$dom = new DOMDocument();

// HTML string
$html_string = '<html>
                    <body>  
                          <div class="product-sku1" name="div_name">The this the div content product-sku</div>
                          <div class="product-sku2" name="div_name">The this the div content product-sku</div>
                          <div class="product-sku" name="div_name">The this the div content product-sku</div>
                    </body>
                </html>';

//load the html
$html = $dom->loadHTML($html_string);

//discard white space 
$dom->preserveWhiteSpace = TRUE;

//the table by its tag name
$divs = $dom->getElementsByTagName('div');

// loop over the all DIVs
foreach ($divs as $div) {
    if ($div->hasAttributes()) {
        foreach ($div->attributes as $attribute){
            if($attribute->name === 'class' && $attribute->value == 'product-sku'){
                // Peri DIV class name and content
                echo 'DIV Class Name: '.$attribute->value.PHP_EOL;
                echo 'DIV Content: '.$div->nodeValue.PHP_EOL;
            }
        }
    }
}

答案 1 :(得分:0)

我会使用正则表达式(正则表达式)来完成拉出skus。

正则表达式:

preg_match('~<div class="product-sku"><b>Event Code:</b>(.*?)</div>~',$html,$matches);

请参阅php regex docs

新代码:

<?php
if(!$events)
{
    echo mysqli_error($con);
}
while($event = mysqli_fetch_row($events))
{
    $htmldown = curl_init($event[4]);
    curl_setopt($htmldown, CURLOPT_RETURNTRANSFER, true);
    $html=curl_exec($htmldown);
    curl_close($htmldown)
    echo "Downloaded";

    preg_match('~<div class="product-sku"><b>Event Code:</b>(.*?)</div>~',$html,$matches);


    foreach ($matches as $row) {
       echo $row;
    }
}
?>

实际上在这种情况下(使用该网页)只有一个sku ...

而不是:

foreach ($matches as $row) {
    echo $row;
}

你可以使用:echo $matches[1];(数组索引1的原因是因为整个正则表达式模式加上sku将在$ matches [0]中,但只有包含sku的子组在$ matches [1]中]。)

答案 2 :(得分:-1)

尝试使用

require('simple_html_dom.php');
$html = new simple_html_dom();
if(!$events)
{
    echo mysqli_error($con);
}
while($event = mysqli_fetch_row($events))
{
    $htmldown = str_get_html($event[4]);
    echo "Downloaded";
    foreach ($htmldown->find('div[class=product-sku]') as $row) {
        $sku = $row->plaintext;
        echo $sku;
    }
}

如果“product-sku”类仅适用于div,则可以使用

 $htmldown->find('.product-sku')