Symfony+;DOMClawler-如何从a<;中提取数据属性;部门>;
我正在使用symfony2.8&DomCrawler解析一个网站,从HTML实体中读取Symfony+;DOMClawler-如何从a<;中提取数据属性;部门>;,symfony,domcrawler,Symfony,Domcrawler,我正在使用symfony2.8&DomCrawler解析一个网站,从HTML实体中读取数据属性时遇到问题。这可能与数据属性的特定约定一样简单,但我在web上找不到任何讨论如何通过DomCrawler检索数据属性的参考或示例 详情如下: 我在正在解析的HTML中遇到了此构造的实例(来自另一个网站,因此我无法修改此HTML): 从DOMCawler文档中,我希望attr函数返回data src属性值,但它返回null;我的函数返回的是一个6个元素的数组,只有数字,没有额外的文本 提前感谢您的帮助。这
数据属性时遇到问题。这可能与数据
属性的特定约定一样简单,但我在web上找不到任何讨论如何通过DomCrawler检索数据属性的参考或示例
详情如下:
我在正在解析的HTML中遇到了此构造的实例(来自另一个网站,因此我无法修改此HTML):
从DOMCawler文档中,我希望attr
函数返回data src
属性值,但它返回null;我的函数返回的是一个6个元素的数组,只有数字,没有额外的文本
提前感谢您的帮助。这可以使用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;
}
此函数来自。我的经验是,爬虫程序不喜欢复杂的xpath表达式,这导致从DOMClawler切换到直接使用xpath/dom
您的基本xpath查询类似于//div/@data src
Hi Shaun-谢谢您这么做,但我无法替换Symfony中给定的。您建议的查询可以很好地工作(我对其进行了测试),但我简化了示例的要求,实际上,某些情况下div容器中可能有文本,我还需要访问和存储该文本以及属性值-Larry
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 );
}
/**
* 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;
}