1

が見つかったxpathをリストする次のコードがあります$value

特定のURL(写真を参照)に対してtd1、終了タグがない非標準タグが検出されました。下のスクリーンショットにあるように、おそらくサイト開発者はそれを意図的にそこに置いています。

この要素は、ノードのコアクトXPathを識別する際に問題を引き起こします。

壊れたXpathの例:

/html/body/div[2]/div[2]/table/tr[2]/td/table/tr[1]/td[2]/table/tr[2]/td[2]/table[3]/tr[2]/**td1**/td[2]/span/u[1]

(ご覧のとおり、td1はXpathで識別され、チェーンされています)

この要素を削除することで、目的の有効なXPathを構築するのに役立つと思います。

有効な例は

/html/body/div[2]/div[2]/table/tr[2]/td/table/tr[1]/td[2]/table/tr[2]/td[2]/table[3]/tr[2]/td[2]/span/u[1]

DOMXpathの以前のロードを削除するにはどうすればよいですか?他にアプローチはありますか?

td1以外の可能性があるすべての無効なタグ(h8、diwなど)を削除したいと思います...

private function extract($url, $value) {

        $dom = new DOMDocument();

        $file = 'content.txt';
        //$current = file_get_contents($url);
        $current = CurlTool::downloadFile($url, $file);
        //file_put_contents($file, $current);

        @$dom->loadHTMLFile($current);

        //use DOMXpath to navigate the html with the DOM
        $dom_xpath = new DOMXpath($dom);

        $elements = $dom_xpath->query("//*[text()[contains(., '" . $value . "')]]");
        var_dump($elements);
        if (!is_null($elements)) {

            foreach ($elements as $element) {
                var_dump($element);
                echo "\n1.[" . $element->nodeName . "]\n";

                $nodes = $element->childNodes;
                foreach ($nodes as $node) {
                    if( ($node->nodeValue != null) && ($node->nodeValue === $value) ) {
                        echo '2.' . $node->nodeValue . "\n";
                        $xpath = preg_replace("/\/text\(\)/", "", $node->getNodePath());
                        echo '3.' . $xpath . "\n";
                    }
                }
            }
        }
    }

ここに画像の説明を入力してください

4

2 に答える 2

1

すっごく...おそらくstr_replace($current, "<td1 va-laign=\"top\">", "")トリックを行うことができますか?

于 2012-10-09T15:24:50.667 に答える
1

XPath を使用して、問題のあるノードを見つけて削除し、その子を DOM 内のその場所に昇格させることができます。次に、パスが正しくなります。

$dom_xpath = new DOMXpath($dom);
$results = $dom_xpath->query('//td1'); // (or any offending element)
foreach ($results as $invalidNode)
{
    $parentNode = $invalidNode->parentNode;
    while ($invalidNode->childNodes)
    {
        $firstChild = $invalidNode->firstChild;
        $parentNode->insertBefore($firstChild,$invalidNode);
    }
    $parentNode->removeChild($invalidNode);
}

編集:

有効な要素のリストを使用してそれを否定することで、問題のある要素のリストを作成することもできます。

// Build list manually from the HTML spec:
// See: http://www.w3.org/TR/html5/section-index.html#elements-1
$validTags = array();

// Convert list to XPath:
$validTagsStr = '';
foreach ($validTags as $tag)
{
    if ($validTagsStr)
    {   $validTagsStr .= ' or ';    }
    $validTagsStr .= 'self::'.$tag;
}
$results = $dom_xpath->query('//*[not('.$validTagsStr.')');
于 2012-10-09T15:30:45.450 に答える