首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中使用html5lib的Xpath

在PHP中使用html5lib的Xpath
EN

Stack Overflow用户
提问于 2014-08-25 10:48:27
回答 2查看 1.1K关注 0票数 4

我有一个基本的代码不起作用。如何在html5lib php中使用Xpath?或以任何其他方式使用HTML5的Xpath。

代码语言:javascript
复制
$url = 'http://en.wikipedia.org/wiki/PHP';
$response = GuzzleHttp\get($url);

$html5 = new Masterminds\HTML5();
$dom = $html5->loadHTML($response);

$xpath = new DOMXPath($dom);

$elements = $xpath->query('//h1');
//$elements = $dom->getElementsByTagName('h1');

foreach ($elements as $element)
{
    var_dump($element);
}

没有发现任何元素。使用$xpath->query('.')可以获得根元素(一般情况下,xpath似乎有效)。$dom->getElementsByTagName('h1')在工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-25 13:47:58

因此,看起来html5lib正在为我们设置一个默认名称空间。

代码语言:javascript
复制
$url = 'http://en.wikipedia.org/wiki/PHP';
$response = GuzzleHttp\get($url)->getBody();
$html5 = new Masterminds\HTML5();
$dom = $html5->loadHTML($response);
$de = $dom->documentElement;
if ($de->isDefaultNamespace($de->namespaceURI)) {
    echo $de->namespaceURI . "\n";
}

这一产出如下:

代码语言:javascript
复制
 http://www.w3.org/1999/xhtml

要使用xpath对命名空间节点进行查询,需要注册名称空间并在查询中使用前缀。

代码语言:javascript
复制
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('n', $de->namespaceURI);

$elements = $xpath->query('//n:h1');
foreach ($elements as $element)
{
    echo $element->nodeValue;
}

这将输出PHP

通常,当涉及默认名称空间时,我发现在xpath查询中前缀所有内容都很乏味,所以我只需去掉它。

代码语言:javascript
复制
$de = $dom->documentElement;
$de->removeAttributeNS($de->getAttributeNode("xmlns")->nodeValue,"");
$dom->loadXML($dom->saveXML()); // reload the existing dom, now sans default ns

在此之后,您可以使用原始xpath,它将运行得很好。

代码语言:javascript
复制
$elements = $xpath->query('//h1');
foreach ($elements as $element)
{
    echo $element->nodeValue;
}

这现在也输出了PHP

因此,修改后的示例版本如下:

示例:

代码语言:javascript
复制
$url = 'http://en.wikipedia.org/wiki/PHP';
$response = GuzzleHttp\get($url)->getBody();
$html5 = new Masterminds\HTML5();
$dom = $html5->loadHTML($response);

$de = $dom->documentElement;
if ($de->isDefaultNamespace($de->namespaceURI)) {
    $de->removeAttributeNS($de->getAttributeNode("xmlns")->nodeValue,"");
    $dom->loadXML($dom->saveXML());
}

$xpath = new DOMXPath($dom);
$elements = $xpath->query('//h1');
foreach ($elements as $element)
{
    var_dump($element);
}

输出:

代码语言:javascript
复制
class DOMElement#11 (18) {
  public $tagName =>
  string(2) "h1"
  public $schemaTypeInfo =>
  NULL
  public $nodeName =>
  string(2) "h1"
  public $nodeValue =>
  string(3) "PHP"
  ...
  public $textContent =>
  string(3) "PHP"
}
票数 4
EN

Stack Overflow用户

发布于 2015-05-16 17:05:51

使用disable_html_ns选项。

代码语言:javascript
复制
$url = 'http://en.wikipedia.org/wiki/PHP';
$response = GuzzleHttp\get($url)->getBody();
$html5 = new Masterminds\HTML5(array(
    'disable_html_ns' => true, // add `disable_html_ns` option
));
$dom = $html5->loadHTML($response);

$xpath = new DOMXPath($dom);
$elements = $xpath->query('//h1');

foreach ($elements as $element) {
    var_dump($element);
}

https://github.com/Masterminds/html5-php#options

disable_html_ns (布尔值):阻止解析器自动将HTML5命名空间分配给DOM文档。这是用于非命名空间感知的DOM工具。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25484217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档