scrapy爬虫编写-常用xpath选择器和css选择器

编写scrapy爬虫,处理items相关元素数据,涉及到selector, 整理备查。

目录

一、常用xpath使用方法

二、css语法

三、xpath选择器整理

四、css选择器整理

 

一、常用xpath使用方法:


xpath常用语法

/:根节点

//xxx/zzz:路径

//div:去全局的子孙中找所有的div元素

.//表示去当前对象的子孙中找

/xxx//div:去儿子对象中找xxx节点下所有的div元素

*:匹配任意节点元素

/html/body/div[1]:选取body下的第一个div节点

//div[@class="xxx"]:选取class属性为xxx的div节点

//@attr:获取attr对应的值

常用函数

text():提取文本信息,//*[@class='xxx']/text()

position():选取第几个节点,//*[position()=1]

last():选取最后一个节点,//*[last()]

starts-with(@attr,substr):attr属性值开头substr的节点

contains(@attr,substr):attr属性值是否包含substr

运算符

|:计算两个节点集合,比如//div|//li

比较运算符=,!=,<=...,比如//price[text()>10]

算数运算符:+,-,*,div,比如//price[text()+1]

逻辑运算符:or,and,[@class='xxxx' or @class='yyyy']


xpath语法案例:以取a标签为案例,div、span等都相同

xpath('//a'):找到全局中所有的a标签

xpath('//a/text()  '):获取a标签的文本值

xpath('//a/span'):a标签对象儿子下的span标签

xpath('//a[2]'):a标签找到后,返回的是一个列表,[n]列表的n位置的值

xpath('//a[@id]'):找全局中属性为id的a标签

xpath('//a[@id="i1"]'):找全局中属性id为i1的a标签

xpath('//a/@id'):取a标签的id的属性值

xpath('//a[@href="link.html"][@id="i1"]'):两个[]代表双条件,需要href="link.html“,且id="i1"的a标签

xpath('//a[contains(@href, "link")]'):a标签的href需要包含"link"字符

xpath('//a[starts-with(@href, "link")]'):a标签的href需要以"link"开头

xpath('//a[re:test(@id, "i\d+")]'):正则表达式的写法,需要有re:test

xpath('//a[re:test(@id, "i\d+")]/@href').extract(),正则表达式的写法案例

xpath(.//)在当前基础上往下找,需要加“.”,比如用在for循环中

obj.extract()#列表中的每一个对象转化字符串==>返回一个列表

obj.extract_first() #列表中的每一个对象转化字符==>列表中的第一个元素

xpath('/html/body/ul/li/a/@href').extract():一层层去找标签
 

二、css语法

基本语法

.classvalue:选择class属性为classvalue的元素

#idvalue:选择id值为idvalue的元素

p:选择所有的p元素

div,p:选择所有的div和p元素

div~p:前面有div元素的每个p元素,div和p为兄弟节点

li span :选择li内部所有的span元素

div>p:选择父结点为div的所有p元素

::text/::attr(src):文本信息/提取某个属性的值,比如a::attr(href),提取超链接


属性的语法

[attr]选择所有带attr属性的元素

[attr=val]选择attr值为val的所有元素:[numvalue=num1]

[attr^=val]选择attr属性值以val开头的元素:[src^=http]

[attr$=val]选择attr属性值以val结尾的元素:[src^=.jpg]

[attr*=val]选择attr属性值包含val的元素:[src*=douban]


ele语法

ele:first-of-type:所有子元素为ele的第一个元素

ele:first-child:第一个元素为ele的元素

ele:only-of-type:类型为ele的元素

ele:only-child:唯一子元素的每个ele元素

ele:nth-of-type(n):选择第n个ele元素

ele:nth-child(n):第n个子元素为ele的元素

ele:last-child:最后一个为ele的子元素
 

三、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[@lang]选取所有拥有lang属性的div元素
//div[@lang='eng']选取所有lang属性为eng的div元素
/div/*选取属于div元素的所有子节点
//*选取所有元素
//div[@*]选取所有带(任意)属性的div元素
/div/a | //div/p选取所有div元素的a和p元素
//span | //ul选取文档中的span和ul元素
article/div/p | //span选取所有属于article元素的div元素的p元素以及文档中的所有span元素
//div[@id='1']/h1/text()获取id为1的div标签下的h1标签里的内容
//span[not(@class)]选择不包含class属性的span节点
//span[not(@class) and not(@id)]选择不包含class和id属性的span节点
//span[not(contains(@class,'expire'))]选择不包含class="expire"的span
//span[contains(@class,'expire')]选择包含class="expire"的span
//h2[contains(text(),'Activated')]选择标签内容里包含Activated的h2标签
//div[not(contains(text(),'activated'))]选择标签内容中不包含activated的div标签

XPATH如何选择不包含某一个属性的节点

我们知道选择包含某一特定属性的节点,可以使用例如//tbody/tr[@class]来选择。那么不含某属性的节点如何用xpath取得呢?

这里可以用到not。例如排除一个属性的节点可以使用//tbody/tr[not(@class)]来写,排除一个或者两个属性可以使用//tbody/tr[not(@class or @id)]来选择。

 

四、css 选择器整理

表达式说明
*选择所有节点
# container选择id为container的节点
.container选取所有class 包含container的节点
li a选取所有li下的所有a节点 (子节点)
ul + p选择ul后面的第一个p元素(兄弟节点)
div#container > ul选取id为container的div的第一个ul子元素
ul ~ p选取与ul相邻的所有p元素
a[title]选取所有有title属性的a元素
a[href="a.com"]选取所有href属性为a.com值的a元素
a[href*="a"]选取所有href属性包含a的a元素
a[href^="http"]选取所有href属性值以http开头的a元素
a[href$=".jpg"]选取所有href属性值以.jpg结尾的a元素
inupt[type=radio]:checked选取状态为选中的radio元素
div:not(#container)选取所有id不为container的div元素
li:nth-child(3)选取第三个li元素
tr:nth-child(2n)第偶数个tr元素

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件: import scrapy from demo1.items import Demo1Item import urllib from scrapy import log # BOSS直聘网站爬虫职位 class DemoSpider(scrapy.Spider): # 爬虫名, 启动爬虫时需要的参数*必填 name = 'demo' # 爬取域范围,允许爬虫在这个域名下进行爬取(可选) allowed_domains = ['zhipin.com'] # 爬虫需要的url start_urls = ['https://www.zhipin.com/c101280600/h_101280600/?query=测试'] def parse(self, response): node_list = response.xpath("//div[@class='job-primary']") # 用来存储所有的item字段 # items = [] for node in node_list: item = Demo1Item() # extract() 将xpath对象转换为Unicode字符串 href = node.xpath("./div[@class='info-primary']//a/@href").extract() job_title = node.xpath("./div[@class='info-primary']//a/div[@class='job-title']/text()").extract() salary = node.xpath("./div[@class='info-primary']//a/span/text()").extract() working_place = node.xpath("./div[@class='info-primary']/p/text()").extract() company_name = node.xpath("./div[@class='info-company']//a/text()").extract() item['href'] = href[0] item['job_title'] = job_title[0] item['sa 报错: C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\python.exe "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\pydevconsole.py" --mode=client --port=55825 import sys; print('Python %s on %s' % (sys.version, sys.platform)) sys.path.extend(['C:\\Users\\xieqianyun\\demo1', 'C:/Users/xieqianyun/demo1']) Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] Type 'copyright', 'credits' or 'license' for more information IPython 7.10.0 -- An enhanced Interactive Python. Type '?' for help. PyDev console: using IPython 7.10.0 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') Traceback (most recent call last): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\IPython\core\interactiveshell.py", line 3319, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-fc5979762143>", line 1, in <module> runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile pydev_imports.execfile(filename, global_vars, local_vars) # execute the script File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "C:/Users/xieqianyun/demo1/demo1/begin.py", line 3, in <module> cmdline.execute('scrapy crawl demo'.split()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\cmdline.py", line 145, in execute cmd.crawler_process = CrawlerProcess(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 267, in __init__ super(CrawlerProcess, self).__init__(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 145, in __init__ self.spider_loader = _get_spider_loader(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 347, in _get_spider_loader return loader_cls.from_settings(settings.frozencopy()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 61, in from_settings return cls(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 25, in __init__ self._load_all_spiders() File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 47, in _load_all_spiders for module in walk_modules(name): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\utils\misc.py", line 73, in walk_modules submod = import_module(fullpath) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 994, in _gcd_import File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "C:\Users\xieqianyun\demo1\demo1\spiders\demo.py", line 4, in <module> from scrapy import log ImportError: cannot import name 'log'

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值