CssSelector组件
CssSelector组件把CSS选择器转换成Xpath表达式。
安装 ¶
你可以通过下述两种方式安装:
通过Composer安装(Packagist上的
symfony/css-selector
)通过官方git宝库(https://github.com/symfony/css-selector)
然后,包容vendor/autoload.php
文件,以开启Composer提供的自动加载机制。否则,你的程序将无法找到这个Symfony组件的类。
用法 ¶
为何使用CSS选择器 ¶
当你要解析一个HTML或XML文档时,目前最强力的方法是Xpath。
Xpath表达式极其灵活,几乎总是有会有一个Xpath表达式能够找到你需要的元素。不幸的是,它们也变得非常复杂,学习曲线是陡峭的。甚至普通操作(像是查找一个带有特定的class的元素)都需要很长很笨重的表达式。
许多开发者——特别是web开发者——习惯于使用CSS选择器(selector)来找到元素。不光适合于样式表,CSS选择器配合 querySelectorAll
函数还可用于JavaScript,包括流行的JS类库比如JQuery,Prototype以及MooTools等。
CSS选择器相比Xpath少了几分强大,但却易写、易读、易理解。由于它们不够强力,差不多所有的CSS选择器都可以被转换为一个等价的Xpath。然后这个Xpath表达式即可用于其他的函数或类中,以便借助Xpath来在文档中查找元素。
CssSelector组件 ¶
本组件的唯一目标就是把CSS selector转换成与之等价的Xpath,使用 toXPath()
方法:
1 2 3 4 |
use Symfony\Component\CssSelector\CssSelectorConverter;
$converter = new CssSelectorConverter();
var_dump($converter->toXPath('div.item > h4 > a')); |
这会输出以下内容:
1 |
descendAnt-or-self::div[@class and contains(concat(' ',normalize-space(@class), ' '), ' item ')]/h4/a |
你可以将这个表达式用在,比如, DOMXPath
或是 SimpleXMLElement
中,以便在文档中找到元素。
Crawler::filter()
方法使用CssSelector组件,基于一个CSS选择器字符串来查找元素。参考 DomCrawler组件 以了解细节。
CssSelector组件的限制 ¶
不是所有CSS选择器都可以被转换为等价的Xpath。
有几个CSS selector只对浏览器上下文有意义。
- link-state selectors(链接状态选择器):
:link
,:visited
,:target
- selectors based on user action(基于用户动作的选择器):
:hover
,:focus
,:active
- UI-state selectors(UI状态选择器):
:invalid
,:indeterminate
(however,:enabled
,:disabled
,:checked
and:unchecked
are available)
Pseudo-elements (:before
, :after
, :first-line
,
:first-letter
) 伪元素不受支持,因为它们选择的是文本部分而非元素。
另有几个pseudo-classes(伪类)尚未支持:
-
*:first-of-type
,*:last-of-type
,*:nth-of-type
,*:nth-last-of-type
,*:only-of-type
. (这些都与一个元素的名称 (如li:first-of-type
) 一起工作,但却不能与*
工作。)