0

我可以选择父 div 类和所有列表项,但尝试使用 UPC 编号捕获特定项并删除标签以及内容。请注意“.parent”类下的所有子项中没有 id 或类。这是屏幕抓取,因此无法添加任何内容。此外, li 顺序可以更改,因此无需倒计时。

只想捕捉...

000022200000

这是字符串/网页...

<div class="parent">
   <ul>
       <li>...</li>
       <li><b>UPC:</b>000022200000</li>

(这些 upc# 显然都不同,我不想要其他内容)

我正在使用简单的 HTML DOM来解析数据,就像这样......

foreach($shdom2->find('.parent ul li') as $e) {
            $shdom = $shdom.'<p>UPC: '.$e.'</p>';
    }

这个循环将我带回所有列表项,现在我需要缩小到带有 UPC# 的那个。

我相信我可以使用 preg_match(),但我无法让一个为我工作。

这是对 preg_match() 的使用,它确实适用于项目中更简单的节点......

if (preg_match('/G00([^\/]*)/i', $e, $regs))
        {
            $r = $regs[0];
            $shdom = $shdom.$r.',';
        }
4

2 回答 2

1

您应该能够使用正则表达式:

/UPC:\<\/b\>(\d+)/

<li>如果您正在遍历 dom 或preg_match_all()针对原始文档,则针对每个

于 2013-03-11T20:42:52.113 回答
1

您可以找到<b>标签,获取它的父标签,然后在其子标签中找到您的 UPC,如下所示:

foreach( $shdom2->find('.parent ul li b') as $b) {
    $li = $b->parent();
    foreach( $li->children() as $child) { 
        echo $child; // This should print your UPC eventually
    }
}

您必须查看正在形成的 DOM,以了解 UPC 在子节点中的位置(它将是一个文本节点)。您应该可以使用索引直接访问它,就像这样,我只是不确定正确的索引值:

foreach( $shdom2->find('.parent ul li b') as $b) {
    if( $b->plaintext === 'UPC:') {
        $li = $b->parent();
        $upc = $li->children( 1); // Change 1 to correct value if wrong
        echo $upc;
    }
}

编辑:我已经为 PHP 的算法创建了一个端口DOMDocument

$doc = new DOMDocument;
$doc->loadHTML( $html);

$xpath = new DOMXPath( $doc);

foreach( $xpath->query( '//div[@class="parent"]/ul/li/b') as $b) {
    $li = $b->parentNode;
    $upc = $li->childNodes->item(1);
    echo $upc->wholeText;
}

你可以看到这个输出

000022200000
于 2013-03-11T20:44:22.600 回答