先上些干火:
今天使用scrapy写爬虫 碰到一个有意思的问题 也是出现 [ ] 对 就是出现了这种空格 虽坑了我 不过也发现了一个xpath新用法(也可能是我之前没发现)。
xpath规则 : //*[@class="c_feature"]/li[4]/a/@href 爬去到的结果应该是:['http://www.cfca.com.cn']
但是有些网站则是: //*[@class="c_feature"]/li[5]/a/@href
所以有些结果也会爬取到 []
测试了一下 //*[@class="c_feature"]/li[4 or 5]/a/@href 这样也可以使用 也解决了问题
声明://*[@class="c_feature"]/li[4 | 5]/a/@href 是去 4 和 5 的资源的意思
下面xpath知识小结:
三把斧
一。 / 表示取子 【即挨着的那个
比如<div >
<a > xxxxx
<img>M</>
< /a>
</div>
div/a 正确 div/img 错误
二。 // 表示取后代
//div 表示取所有div的子元素
三。 @ 取属性
//a[@href="ssss"] 表示取拥有取属性href为ssss的 a 元素
//a/@href 表示取属性 即如果此时的href ="ssss" 那么取得就是ssss
此外 取标签内文本的方式是:
<span>你好!</span>
.../span/text() 即可取得
//a/@href 表示取属性 即如
/article/div[1] 选取属于article子元素的第一个div元素
//div[@class="lang"] 选取所有class属性为 lang 的div元素
/div/* 选取div的所有子元素
下面css选择器知识小结:
刚开始总感觉css挺麻烦的 后面会用了 才知道 自己差点又错过一个好东西 css 真的大多时候比xpath要简洁
同样css 三把斧
一。* 选取所有节点
二。 #container #表示取id 取id为container的节点
三。 .container . 表示取类class 取class为container的节点
li a 中间空格 表示取 li 下的所有 a 元素
ul+p 选取ul后面的第一个p元素
div#cntainer>ul 表示 选取id为container的div 的第一个ul子元素
ul~p 选取与ul相邻的所有p元素
a[title] 选取所有有title属性的a元素
a[href="https://www.abc.com"] 选取所有属性为https://www.abc.com的a的元素
a[href*="jobble"] 选取所有href 属性包含jobble的a 元素
a[href^="https"] 选取所有以https开头的a元素
a[href$=".jpg"] 选取所有以.jpg结尾的a元素
input[type=radio]:checked 选取选中的radio元素
div:not(#container) 选取所有id 非 container 的 div属性
li:nth-child(2) 选取第3个li元素
举个栗子:
response.css(".entry-header .tt2 h1::text") 取entry-header类下的 tt2类 下的 h1标签内的文本内容
response.css(".entry-header a::attr(href)") 取entry-header类下的 a标签中href属性内容 【取网址】
css和xpath两个选择器的
都会容易落掉
css(".job") “ . ” 很重要
xpath("//div") " // " 很重要