专栏:007:xpath使用及其实战

系列爬虫专栏

崇尚的学习思维是:输入,输出平衡,且平衡点不断攀升。

曾经有大神告诫说:没事别瞎写文章;所以,很认真的写的是能力范围内的,看客要是看不懂,不是你的问题,问题在我,得持续输入,再输出。

今天的主题是:xpath的使用及其心理学图书抓取

1:框架

序号 内容 说明
01 概念 --
02 xpath语法 --
03 语法实例 --
04 实战心理学图书抓取 --
05 参考及总结 --

2:概念

  • Xpath
    XPath一门在 XML 文档中查找信息的语言。XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
    XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。

复述:相当于定位地址,比如,我要找清华大学在哪:30 Shuangqing Rd, Haidian, Beijing, China 。先定位在中国,再定位在北京,再定位在海淀区,继续定位具体的街道地址。
那比如你定位到北京:那北京很多区。
那再比如你定位到海淀区:那海淀区也分很多地方。

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。(解析就是对这些节点进行定位提取需要的信息)

  • lxml
    lxml 是一种使用Python 编写的库,可以迅速、灵活地处理XML。 它支持XML Path Language (XPath) 和Extensible Stylesheet Language Transformation (XSLT),并且实现了常见的ElementTree API。

lxml是python第三方库,需要自己安装。安装会遇到很些问题,还是那句话:生命不息,折腾不止。


3:xpath语法

表格法:

序号 表达式 描述
01 nodename 选取此节点的所有子节点
02 / 从根节点选取
03 // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
04 . 选取当前节点
05 .. 选取当前节点的父节点
06 @ 选取属性

看不懂?

推荐:chrome 插件:XPath Helper

chrome 浏览器也可以copy xpath.

打不开? 那搜索引擎玩着吧.

效果显示:
w3school:xpath 教程
想要搜索到:路径表达式:如下表:中的nodename单词

0001.png

层层查询下来:

0002.png

4:语法实例

xpath语法实例:chrome 插件:Xpath helper
目标:心理学图书链接

  • 图书名称:Bookname
    //li/div/a/@title
0003.png
  • 作者: Writer
    //div[@class="publisher_info"]/p[@class="author"]/a[1]//@title
0004.png
  • 出版时间:Time
    //div[@class="publisher_info"]/p[@class="publishing_time"]
  • 评价数: Star
    //p[@class="star"]/a
  • 简介: Detail
    //p[@class="detail"]
  • 图书售价:Price_n,
    //div[@class="inner"]/p[@class="price"]/span[@class="price_n"]
  • 图书定价:Price_r
    //div[@class="inner"]/p[@class="price"]/span[@class="price_r"]
  • 网址链接:Url
    //div[@class="inner"]/a//@href

5:实战心理学图书

在lxml下如何使用:
selector = etree.HTML(response) response为网页源代码

抓取:图书标题,评价人数实例:

# title属性是书名
self.Bookname_pattern_3 = r"//li/div/a/@title"
selector = etree.HTML(response)
booknames = selector.xpath(self.Bookname_pattern_3) # 返回一个list
# 评价人数
self.Star_pattern_3 = r'//p[@class="star"]/a/text()'
selector = etree.HTML(response)
stars = selector.xpath(self.Star_pattern_3)        # 返回一个list

# 核心代码:
    def contents_xpath(self, one_url):
        html = requests.get(one_url, headers=self.headers)
        if html.status_code != 200:
            return -1
        else:
            response = html.text
        selector = etree.HTML(response)
        booknames = selector.xpath(self.Bookname_pattern_3)
        writers = selector.xpath(self.Writer_pattern_3)
        time = selector.xpath(self.Time_pattern_3)
        stars = selector.xpath(self.Star_pattern_3)
        details = selector.xpath(self.Detail_pattern_3)
        price_n = selector.xpath(self.Price_n_pattern_3)
        price_r = selector.xpath(self.Price_r_pattern_3)
        urls = selector.xpath(self.Url_pattern_3)
        All_data = []
        for booknames, writers, time, stars, details, price_n, price_r, urls in zip(booknames, writers, time, stars, details, price_n, price_r, urls):
            data = {
                "bookname": booknames,
                "writers": writers,
                "stars": stars,
                "details": details,
                "price_n": price_n,
                "price_r": price_r,
                "urls": urls
            }
            All_data.append(data)

完整版代码:待重构

最后的数据存放在一个文本中:
如图:

0005.png
0006.png

当然:代码还可以继续重构,比如,图书介绍好些空白行如何处理;比如:先抓大再进行xpath等等之类的代码优化...

心理学这个图书栏有100页。也可以尝试100页如何抓取,存取。会不会出现问题。
核心代码,try ...except都没写...(差评!);不写注释(差评!)


6:参考及总结

01: w3school:xpath教程
02: lxml文档
03: 练习版代码

爬取思路还是和之前的系列专栏一致,解析方法变了而已。

Github:github

关于本人:

国内小硕,半路出家的IT学习者。
兴趣领域:爬虫 , 数据科学
本人正在构建一个共同成长爬虫小型社群,目前已有志同道合的人入群。
有兴趣私信。
文档及代码托管在Github上。


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

推荐阅读更多精彩内容