我们有以下代码列出找到$value
的xpath。
我们检测到给定的网址(参见图片)非标准标记td1
,此外没有结束标记。正如您在下面的屏幕截图中看到的那样,网站开发人员可能会故意将其放在那里。
此元素在标识节点的corect 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]
(如您所见,在Xpath中识别并链接了td1)
我们认为通过删除这个元素,它可以帮助我们构建我们追求的有效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";
}
}
}
}
}
答案 0 :(得分:1)
Sooo ......也许str_replace($current, "<td1 va-laign=\"top\">", "")
可以做到这一点?
答案 1 :(得分: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.')');