看官方文档(链接附在文末),看到了关于 get()、get()方法的使用,查阅网络没有资料,那就自己记录一下。y(˙ᴗ.)耶~y(˙ᴗ.)耶~y(˙ᴗ.)耶~y(˙ᴗ.)耶~y(˙ᴗ.)耶~y(˙ᴗ.)耶~y(˙ᴗ.)耶~y(˙ᴗ.)耶~y(˙ᴗ.)耶~ 先说结论:对于 scrapy.selector.unified.SelectorList 对象,getall()==extract(),get()==extract_first()对于 scrapy.selector.unified.Selector 对象,getall()==extract(),get()!=extract_first()使用 scrapy shell 进行测试
scrapy shell https://gavbus668.com/
得到如下结果:皆是常规操作
返回 html 的前 200 个字符,看看没有发生错误
response.text[:200]
得到:
Out[3]: ‘<html>rn<head>rn <meta charset=”utf-8″>rn <meta http-equiv=”X-UA-Compatible” content=”IE=edge”>rn <meta name=”renderer” content=”webkit”>rn <meta name=”viewport” content=”width=device-widt’
bingo
继续,使用 Scrapy Selector 下一步操作
In [5]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)
Out[5]:[<Selector xpath=’//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’ data=’DNW-025 彼女が 制服に着替えたら。5′>, <Selector xpath=’//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’ data=’rntttttt’>, <Selector xpath=’//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’ data=’rntttttt’>, <Selector xpath=’//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’ data=’ / ‘>]
In [10]: type(response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’))
Out[10]: scrapy.selector.unified.SelectorList
发现使用 Selector 得到的是一个 SelectorList 对象实例
所以 get()、getall()、extract()、extract_first()是 SelectorList 对象实例的方法
继续使用 get()、getall()、extract()、extract_first(),观察区别:
In [6]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’).get()
Out[6]: ‘DNW-025 彼女が制服に着替えたら。5’
In [7]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’).getall()
Out[7]: [‘DNW-025 彼女が制服に着替えたら。5’, ‘rntttttt’, ‘rntttttt’, ‘ / ‘]
In [8]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’).extract()
Out[8]: [‘DNW-025 彼女が制服に着替えたら。5’, ‘rntttttt’, ‘rntttttt’, ‘ / ‘]
In [9]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’).extract_first()
Out[9]: ‘DNW-025 彼女が制服に着替えたら。5’
over,总结一下:对于 scrapy.selector.unified.SelectorList 对象 get() == extract_first()返回的是一个 list,里面包含了多个 string,如果只有一个 string,则返回 [‘ 我很孤独 ’] 这样的形式 getall() == extract()返回的是 string,list 里面第一个 string
extract_first()与 get()有区别与 Selector 对象有关
In [17]: type(response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’))
Out[17]: scrapy.selector.unified.SelectorList
In [18]: type(response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)[0])
Out[18]: scrapy.selector.unified.Selector
In [19]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)[0].get()
Out[19]: ‘DNW-025 彼女が制服に着替えたら。5’
In [20]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)[0].getall()
Out[20]: [‘DNW-025 彼女が制服に着替えたら。5’]
In [21]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)[0].extract()
Out[21]: ‘DNW-025 彼女が制服に着替えたら。5’
In [22]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)[0].extract_first()
—————————————————————————
AttributeError Traceback (most recent call last)
<ipython-input-22-9eada5e1e561> in <module>
—-> 1 response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)[0].extract_first()
AttributeError: ‘Selector’ object has no attribute ‘extract_first’
In [23]: response.xpath(‘//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’)[0]
Out[23]: <Selector xpath=’//*[@id=”waterfall”]/div[1]/a/div[2]/span/text()’ data=’DNW-025 彼女が制服に着替えたら。5′>
发现:对于 Selector 类型的对象,并不能使用 extract_first()方法,而使用 get()可以
文末附官方文档链接链接 Scrapy 官方教程——关于 get()、getall()方法