10-常见任务示例
2.2.3 常见任务示例
-
获取
id为"firstHeading"的h1标签下span中的text。 -
获取
id为"toc"的div标签内的无序列表(ul)中所有链接URL。 -
获取
class属性包含"ltr"以及class属性包含"skin-vector"的任意元素内所有标题元素(h1)中的文本。这两个字符串可能在同一个class中,也可能在不同的class中。 -
选择
class属性值为"infobox"的表格中第一张图片的URL。 -
选择
class属性以"reflist"开头的div标签中所有链接的URL。 -
选择子元素包含文本"
References"的元素之后的div元素中所有链接的URL。 -
获取页面中每张图片的URL。
//img/@src
有一些XPath表达式,你将会经常遇到。让我们看一些目前在维基百科页面上的例子。维基百科拥有一套非常稳定的格式,所以我认为它们不会很快发生改变,不过改变终究还是会发生的。我们把如下这些表达式作为说明性示例。
//table[@class="infobox"]//img[1]/@src
//*[text()="References"]/../following-sibling::div//a
实际上,你将会经常在XPath表达式中使用到类。在这些情况下,需要记住由于一些被称为CSS的样式元素,你会经常看到HTML元素在其 class 属性中拥有多个类。比如,在一个导航系统中,你会看到一些div标签的 class 属性是" link ",而另一些是" link active "。后者是当前激活的链接,因此会表现为可见或使用一种特殊的颜色(通过CSS)高亮表示。当抓取时,你通常会对包含有特定类的元素感兴趣,具体来说,就是前面例子中的" link "和" link active "。对于这种情况,XPath的 contains() 函数可以让你选择包含有指定类的所有元素。
//div[starts-with(@class,"reflist")]//a/@href
请注意该表达式非常脆弱并且很容易无法使用,因为它对文档结构做了过多假设。
//h1[@id="firstHeading"]/span/text()
//div[@id="toc"]/ul//a/@href
//*[contains(@class,"ltr") and contains(@class,"skin-vector")]//h1//text()