我正在使用Symfony 2.8& DomCrawler解析一个网站,我在从HTML实体中读取init()
属性时遇到问题。它可能与data
属性的特定约定一样简单,但我无法在Web上找到任何讨论如何通过DomCrawler检索数据属性的引用或示例。
以下是详细信息:
我在我正在解析的HTML中遇到过这个构造的实例(来自其他网站,因此我无法修改此HTML):
data
我使用此代码搜索 <div class='slideshowclass' id='slideshow'>
<div data-thumb='http://www.example.com/thumbs/1.jpg'
data-src='http://www.example.com/thumbs/1.jpg'></div>
<div data-thumb='http://www.example.com/thumbs/2.jpg'
data-src='http://www.example.com/thumbs/2.jpg'></div>
<div data-thumb='http://www.example.com/thumbs/3.jpg'
data-src='http://www.example.com/thumbs/3.jpg'></div>
<div data-thumb='http://www.example.com/thumbs/4.jpg'
data-src='http://www.example.com/thumbs/4.jpg'></div>
<div data-thumb='http://www.example.com/thumbs/5.jpg'
data-src='http://www.example.com/thumbs/5.jpg'></div>
<div data-thumb='http://www.example.com/thumbs/6.jpg'
data-src='http://www.example.com/6.jpg'></div>
</div>
&#39}的块并返回div
值:
data-src
在DomCrawler文档中,我希望function getList( Crawler $pWebDoc ) {
$list = $pWebDoc->filter( 'div#slideshow');
if ( !$list )
return null;
$retlist = null;
$x = $list->count();
if ( $x > 0 ) {
/* @var $item Crawler */
$retlist = $list->children()->each( function (Crawler $item, $i ) {
return ( "$i:" . $item->attr( 'data-src' ));
});
}
return ( $retlist );
}
函数返回attr
属性值,但它返回null;从我的函数返回的是一个包含6个元素的数组,只有数字而不是附加文本。
提前感谢您的帮助。
答案 0 :(得分:0)
使用DOMDocument和XPath库可以轻松完成此操作。 XPath确实提供了返回数组值而不是节点的功能。
/**
* Filters the list of nodes with an XPath expression.
*
* The XPath expression should already be processed to apply it in the context of each node.
*
* @param string $xpath
*
* @return Crawler
*/
private function filterRelativeXPath($xpath)
{
$prefixes = $this->findNamespacePrefixes($xpath);
$crawler = $this->createSubCrawler(null);
foreach ($this->nodes as $node) {
$domxpath = $this->createDOMXPath($node->ownerDocument, $prefixes);
$crawler->add($domxpath->query($xpath, $node));
}
return $crawler;
}
此功能来自Crawler.php。我的经验是Crawler对复杂的xpath表达式不满意,导致从DomCrawler切换到直接使用xpath / dom。
您的基本xpath查询类似于//div/@data-src