爬虫课程(八)|豆瓣:十分钟学会使用XPath选择器提取需要的元素值

前面我们在写爬取豆瓣读书内容示例中提到了XPath,本文就详细介绍下在爬虫中如何使用XPath选择器,掌握本文中的内容,将解决98%在爬虫中利用XPath提取元素的需求。

一、XPath简介

XPath 是一门在 XML 或HTML文档中查找信息的语言。XPath 用于在 XML 和HTML文档中通过元素和属性进行导航。

什么是 XPath?

XPath 使用路径表达式在XML和HTML文档中进行导航。

XPath 包含一个标准函数库。

XPath 是一个 W3C 标准。

二、XPath的节点关系

节点(Node)是XPath 的术语。

(图一)html

1)父节点(Parent)

每个元素以及属性都有一个父。在“(图一)html”的例子中,book 元素是 title、author、year 以及 price 元素的父。

2)子节点(Children)

元素节点可有零个、一个或多个子。在“(图一)html”的例子中,title、author、year 以及 price 元素都是 book 元素的子。

3)同胞节点(Sibling)

拥有相同的父的节点。在“(图一)html”的例子中,title、author、year 以及 price 元素都是同胞。

4)先辈节点(Ancestor)

某节点的父、父的父,等等。在“(图一)html”的例子中,title 元素的先辈是 book 元素和 bookstore 元素,

5)后代节点(Descendant)

某个节点的子,子的子,等等。在“(图一)html”的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素。

三、XPath的语法

XPath 使用路径表达式在 XML 和HTML文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式,掌握了这些表达式,可以完成89%的爬虫提取元素的需求。我们编写了将近一百个网站的各种各样的数据提取的XPath代码所涉及到的语法都包含在下面的表格中啦。

XPath表达式清单

article 选取所有article元素的所有子节点

/article 选取根元素article

article/a 选取所有属于article的子元素的a元素

//div/ 选取所有div子元素(不论出现在文档任何地方)

article//div 选取所有属于article元素的后代的div元素,不管它出现在article下的任何位置

//@class 选取所有名为class的属性

/article/div[1] 选取属于article子元素的第一个div元素

/article/div[last()] 选取属于article子元素的最后一个div元素

/article/div[last()-1] 选取属于article子元素的倒数第二个div元素

//div[@class] 选取所有拥有class属性的div元素

//div[@class='article'] 选取所有class属性为article的div元素

//div[@class='article']/text() 选取所有class属性为article的div元素下的text值

/div/* 选取属于div元素的所有子节点

//* 选取所有元素

//div[@*] 选取所有带属性的div元素

//div/a|//div/p 选取所有div元素下的a和p元素

//span|//ul 选取文档中的span和ul元素

article/div/p|//span 选取所有属于article元素的div元素的p元素以及文档中所有的span元素

四、使用XPath提取豆瓣读书书籍标题的示例

我们还是以获取豆瓣读书的书籍信息为例来说明XPath的使用。

获取豆瓣读书的书籍标题

我们这里通过3种方法来提取这个书籍的标题值。

1)方法一:从html开始一层一层往下找,使用Firefox浏览器自带的复制XPath功能使用的就是这个方式。

re1_selector = sel.xpath('/html/body/div[3]/div[1]/div/div[2]/ul/li[1]/div/h2/a/text()').extract()[0]

2)方法二:找到特定的id元素,因为一个网页中id是唯一的,所以再基于这个id往下找也是可以提取到想要的值,使用Chrome浏览器自带的复制XPath功能使用的就是这个方式。

re2_selector = sel.xpath('//*[@id="content"]/div/div[2]/ul/li[1]/div/h2/a/text()').extract()[0]

3)方法三:找到特定的其他非id元素,保障这个非id元素在你获取的规则中是唯一的,再基于这个非id元素往下找。

re3_selector = sel.xpath('//ul[@class="cover-col-4 clearfix"]/li[1]/div/h2/a/text()').extract()[0]

最后我们执行,发现这3种方法都是可以正确获取到“百年法”这个书籍标题。

3种XPath表达式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容