python应用:爬虫框架Scrapy系统学习第一篇——xpath详解
HTML的三大概念:标签、元素以及属性
标签:尖括号中的文本 例:<head>……</head> 标签通常成对出现
元素:标签中的所有内容 元素中可包含元素
属性:标签的特殊标注等 例:<a href="http:\\www.baidu.com">……</a> 其中,href部分称为属性
使用XPath选择HTML元素
使用‘/’+标签名定位
例: /html/body 将定位到body部分
当某便签下出现多个同标签元素时,使用类似数组的方式定位到最准确的位置
切记:此处下标从1开始,而不是编程中常见的从0开始
例:/html/body/div/p[1] 返回相应位置的第一个p元素
/html/body/div/p 返回相应位置的所有p元素
对于大型文档,精确定位往往需要一个非常大的XPath表达式,为避免这种问题,我们可以使用‘//’语法
例://p 将会选择HTML中所有的p元素
//a 将会选择HTML中所有的链接
同时,//语法可用于层次结构中
例://div//a 得到div元素下所有链接
//div/a 得到div元素直接下级的所有链接
注意:元素下与元素直接下级的区别
此外,可通过符号@来直接定位标签属性
例://a/@href 得到所有链接中的href属性
使用text()函数,只选取文本
例://a/text() 得到所有链接中的文本信息
使用符号*选择指定层级的所有元素
//*[@itemprop="name"] 得到包含itemprop="name"的所有元素
选择包含某个特定属性或特定属性值的标签时使用如下结构
例://a[@href] 得到包含href属性的所有链接
//a[@href="http://www.baidu.com"] 得到href值为“http://www.baidu.com”的所有链接
此外,还可以使用以特定子字符起始或包含的能力
例://a[starts-with(@href, "http://")] 得到href属性以http://为起始的所有链接
//a[contains(@href, "baidu")] 得到href属性包含baidu的所有链接
//a[not (contains(@href, "baidu"))] 得到所有href属性不包含baidu的链接
更多类似函数,参照http://www.w3schools.com/xsl/xsl_functions.asp
在使用XPath时,应尽量
避免使用数组索引;
避免使用与数据关系不密切的类名;
使用面向数据的类名;
ID通常都比较可靠(例外情况:以编程方式生成的包含唯一标记的ID 如“order-F5568”;此外,还需注意部分HTML中ID不唯一的情况)