XPath表达式
面对较大的文档,你可能需要写很长的XParh表达式,为了避免这一点,两个斜杠线//可以访问到所有的同名元素。列如,//p可以选择所有的p元素,//a可以选择所有的链接。
eg:
<a href="http://www.iana.org/domains/example">More information...</a>
只选择链接:
$x('//a/@href')
[href="http://www.iana.org/domains/example"]
只选择文字:
$x('//a/text()')
["More information..."]
常见工作
- 获取id为firstHeading的div下的span的文字
$x(//h1[@id="firstHeading"]/span/text())
- 获得id为toc的div下的URL
$x(//div[@id="toc"]/ul//a/@href)
- 在任意class包含skin-vector的元素之内,获取h1的text,这两个字符串可能在同一个class内,或不在。
$x(//*[contains(@class,"ltr") and contains(@class,"skin-vector")]//h1//text())
- 选择class属性是infoclass的table的第一张图片的URL
$x(//table[@class="infobox"]//img[1]/@src)
- 选择class属性是reflist开头的div下面的所有URL链接
$x(//div[starts-with(@class,"reflist")]//a/@href)
- 选择div下面的所有URL链接,并且这个div的下一个相邻元素的子元素包含文字References
$x(//*[text()="References"]/../following-sibling::div//a)
- 获取所有图片的URL
$x(//img/@src)
提前应对网页发生的改变
爬取的目标网页位于远程服务器,这意味着,他的HTML会发生改变。XPath表达式就会失效。一些基本原则,可以帮助我们降低表达式失效的概率:
- 避免使用数组序号!比如:
$x(//*[@id="myid"]/div/div/div[1]/div[2]/div/div[1]/div[1]/a/img)
解决方法:尽量找到离目标标签近的元素,根据元素的id或者class属性,进行抓取。id通常是最靠谱的!
网友评论