scrapy学习笔记——HTML页面解析

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ioiol/article/details/47112853

一、Scrapy Selectors简介

scrapy提供了本身提供了一种基于XPath和CSS 表达式的选择器,叫做Scrapy Selectors。

XPath是一种类似于层级选择的方式,与JQuery选择器有几分相似之处。

/html/head/title :选择head标签内的title标签

/html/head/title/text():选择title的文字

//td:选择所有的<td>标签

//div[@class="mine"]:选择样式表为mine的div元素。

Selector有四个基本的方法:

xpath():参数是xpath表达式,也就是类似于上面例子中的表达式,

css():输入css表达式;

extract():序列化该节点为unicode字符串并返回list;

re():输入正则表达式,返回unicode字符串list列表;

这四个方法返回的都是包含所有匹配节点的list列表。

以上就是scrapy自带选择器的一个简介。

这里面还有很多细节地方都是内容很丰富的,例如正则表达式,xpath表达式,css表达式都是可以单独成为一个学习的单元的内容。

如果是零基础想要学习scrapy,个人觉得还是需要先去了解一下html、http等一些前端和网络知识的。


二、shell中使用选择器

进入scrapy项目的根目录下,例如我的项目的根目录就是E:\pythonWorkSpace\scrapy\firstSpider;

如果这里使用了我之前介绍的eclipse下进行开发调试的话就需要注意,eclipse的工程根目录是否是scrapy项目的根目录。我这里二者并不一致。

完整命令如下:

1.进入命令符,cd E:\pythonWorkSpace\scrapy\firstSpider

2.进入scrapy的shell,scrapy shell "http://www.zhihu.com/question/31810474#answer-16771792"

需要注意这里的url必须有引号。

在命令符中将显示下面的信息:


此时已经可以获得response数据的本地response变量。通过这个变量就能得到response的包头和包体。

同时shell根据response提前初始化了变量sel。

输入下面的命令:

sel.xpath('//title')
sel.xpath('//title').extract()
会得到如下图所示的输出结果:


In为输入,out为命令输出的内容。可以看到sel.xpath('//title')与sel.xpath('//title').extract()方法都是得到一个unicode的输出。


三、在爬虫代码中使用选择器

<span style="font-size:14px;"># -*- coding: utf-8 -*-
import scrapy
from _elementtree import parse
from django.template.defaultfilters import title
import re

class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["zhihu.com"]
    start_urls = (
        'http://www.zhihu.com/question/31810474#answer-16771792',
    )

    def parse(self, response):
        #正则直接匹配页面内容
#         title = response.body
#         name = re.findall(r'<a data-tip="p\$[\$\w-]+?" href="/people/[\$\w-]+?">(.+?)</a>',title)
#         print name
        #选择器提取页面内容
        for sel in response.xpath('//h3'):
            #print sel.extract()
            name = sel.re(r'<a data-tip="p\$[\$\w-]+?" href="/people/[\$\w-]+?">(.+?)</a>')
            if not name:
                pass
            else :
                print name[0]
</span>
在parse方法中,我首先是用了一个正则表达式直接用来匹配所有的答主,后面的是使用了Scrapy的选择器选择了<h3>标签下的内容,在使用正则。大家有兴趣可以查看二者的区别。

分析页面可以发现,<h3>标签下包含多个<a>标签,其中包括答题者的名称、头像、个人签名等。

这里以提取名称为例,只需要在for循环中加入正则表达式即可。

输出结果如下:


由于正则表达式的效率低于选择器,以及较差的可读性,所以在解析页面的时候应该尽可能避免使用正则表达式,而是用其他方式。

尝试对项目进行一下修改,代码如下:

def parse(self, response):
        #选择器提取页面内容
        for sel in response.xpath('//h3/a/text()'):
            name = sel.extract()
            if name:
                print name.strip()
strip()方法就相当于Java中的trim()方法。

提取的结果并不十分理想,出现了一个错误结果,并且结果之间存在两个空行。

这里如果有知道完美写法的同学,请给我留言,谢谢。

但是这段代码的相比正则表达式简洁了很多,并且可读性也好很多。


通过上面的例子已经将Scarpy选择器的基本用法讲清楚了。


四、其他Html解析模块

用于xpath的解析方式并不是很熟悉,而python的html解析模块非常的丰富。

如python自带的HTMLParser,SGMLParser等解析器,以及其他第三方模块。

其中的较有影响力的有:

BeautifulSoup

BeautifulSoup有很多完善的文档,官方提供了中文文档。功能非常好用。

pyQuery

pyQuery是jQuery的python实现,对于熟悉jQuery的同学使用起来会非常方便。


选择一款自己熟悉的解析器会给解析工作带来很大的方便。

展开阅读全文

没有更多推荐了,返回首页