編碼的世界 / 優質文選 / 生涯

python3 scrapy css選擇器(Selectors) 用法


2022年7月17日
-   

想優化一下剛剛寫的爬蟲,改一下Selectors 去看文檔 眼花繚亂 ,所以想在這裏總結一下Selectors 的簡單用法, 不扯別的,就是學會用 ,簡單粗暴的學會用法 我們不如還拿拉勾網實驗可好 滑稽.jpg https://www.lagou.com/zhaopin/Java/

看到了網頁的源代碼,我們想從這個裏面取到需要的數據,就用到了選擇器
相信用到Selectors的小夥伴們都已經建好scrapy項目了,所以我不做贅述 只需要在spiders文件夾下面新建一個forth.py文件內容如下:
import scrapy
from First.items import FirstItem
class Lagou(scrapy.Spider):
name = "forth"
start_urls = [
"https://www.lagou.com/zhaopin/Java/"
]
def parse(self , response):
pass

這篇文章會講解到的css選擇器有
  • #container 選擇id為container的元素
  • .container 選擇所有class包含container的元素
  • * 選擇所有元素
  • div a 選取所有div下所有a元素
  • ul + p 選取ul後面的第一個p元素
  • ul ~p 選取與ul相鄰的所有p元素
  • a:nth-child(2) 選取下面第二個標簽,如果是a的話則選取,不是則不取
  • a:nth-child(2n) 選取第偶數個a元素
  • a:nth-child(2n+1) 選取第奇數個a元素
  • li.multi-chosen > a 選取class為multi-chosen的li的所有a元素
  • a[title] 選取所有擁有title屬性的a元素
  • a[href=”https://www.lagou.com/jobs/3537439.html”] 選取所有href屬性為https://www.lagou.com/jobs/3537439.html的a元素
  • a[href*=”www.lagou.com”] 選取所有href屬性值中包含www.lagou.com的a元素
  • a[href^=”http”] 選取所有href屬性值中以http開頭的a元素
  • div:not(#content-container) 選取所有id為非content-container 的div

  • 開始測試css選擇器
    • #container 選擇id為container的元素
    • .container 選擇所有class包含container的元素
    • * 選擇所有元素


    可以看到所有的信息都在class = .con_list_item 的li標簽之中
     def parse(self , response):
    for item in response.css('.con_list_item *'):
    jobMessage = item.css('::text').extract()
    print(jobMessage)

    修改parse方法中的選擇器 , 使用 .con_list_item * 來找到class為con_list_item 下的所有節點 用jobMessage來接收 ::text 是取出標簽中的內容 為了提取真實的原文數據,需要調用 .extract() 方法 運行名為forth的爬蟲~
    scrapy crawl forth


    拿到數據了~ 雖然很亂但是拿到了對吧~ 說明我們的selectors成功了
    看! 這個h3正合我們的胃口 修改parse方法
     def parse(self , response):
    for item in response.css('.con_list_item h3'):
    jobMessage = item.css('::text').extract()
    print(jobMessage)

    獲取到了所有的h3
    基礎知識大家已經知道了 所以直接上代碼
     def parse(self , response):
    for item in response.css('#lg_tnav h1'):
    jobMessage = item.css('::text').extract()
    print(jobMessage)


    接著學習別的
    • div a 選取所有div下所有a元素

    只需要修改為
    for item in response.css('div a'):


    • ul + p 選取ul後面的第一個p元素

    工作地點是一個span標簽 它後面的內容有一大堆,假如我們只想取第一個 那麼就是一個a標簽 先取出“工作地點”
     def parse(self , response):
    for item in response.css('.title'):
    jobMessage = item.css('::text').extract()
    print(jobMessage)


    接著取出它後面a標簽 只需改動一處
    for item in response.css('.title + a'):


    • ul ~p 選取與ul相鄰的所有p元素

    我們甚至還可以用上面的例子 改動一處
    for item in response.css('.title ~ a'):



    • a:nth-child(2) 選取下面第二個標簽,如果是a的話則選取,不是則不取

    修改代碼如下
     def parse(self , response):
    for item in response.css('.multi-chosen'):
    jobMessage = item.css('a:nth-child(2)::text').extract()
    print(jobMessage)


    如果我們修改一行代碼,取第一個a標簽
    jobMessage = item.css('a:nth-child(1)::text').extract()

    取出的數據為空,為什麼呢? 因為第一個標簽不是a標簽,而是span標簽,所以不取。 再次修改為以下語句,取出第一個span標簽
    jobMessage = item.css('span:nth-child(1)::text').extract()

    由此可得,需要同時匹配標簽和位置才可以取出元素
    • a:nth-child(2n) 選取第偶數個a元素

    我們叒使用之前的例子,只需要修改一句
    jobMessage = item.css('a:nth-child(2n)::text').extract()

    成功的取出第偶數個a元素 那麼類比可得
    • a:nth-child(2n+1) 選取第奇數個a元素 測試一下

    jobMessage = item.css('a:nth-child(2n+1)::text').extract()

    成功的取出的第奇數個a元素中的內容 為什麼沒有取出第一條內容“工作經驗” 呢? 當然是因為它是span標簽中的內容,而不是a標簽中的內容 如果我們用
    jobMessage = item.css('span:nth-child(2n+1)::text').extract()

    就可以取出它了
    • li.multi-chosen > a 選取class為multi-chosen的li的所有a元素

    我們叕用上面的例子,修改代碼如下
     def parse(self , response):
    for item in response.css('li.multi-chosen > a'):
    jobMessage = item.css('::text').extract()
    print(jobMessage)


    • a[title] 選取所有擁有title屬性的a元素

    修改代碼如下
     def parse(self , response):
    for item in response.css('a[data-lg-tj-no]'):
    jobMessage = item.css('::text').extract()
    print(jobMessage)


    • a[href=”https://www.lagou.com/jobs/3537439.html”] 選取所有href屬性為https://www.lagou.com/jobs/3537439.html的a元素

    要取出href=”https://www.lagou.com/jobs/3537439.html”的a標簽 下 h3標簽中的內容 代碼如下
    for item in response.css('a[href="https://www.lagou.com/jobs/3537439.html"] h3'):
    jobMessage = item.css('::text').extract()


    • a[href*=”www.lagou.com”] 選取所有href屬性值中包含www.lagou.com的a元素

    修改代碼
    for item in response.css('a[href*="www.lagou.com"] h3'):


    • a[href^=”http”] 選取所有href屬性值中以http開頭的a元素

    修改代碼
    for item in response.css('a[href^="http"]'):
    jobMessage = item.css('::text').extract()


    • div:not(#content-container) 選取所有id為非content-container 的div

    頁面的結構分上下兩部分,頭部的id 為lg_header , 下部的id為content-container 為了選取上部分,我們有兩種方法 1.#lg_header 或者 div:not(#content-container)
    修改代碼如下
    for item in response.css('div:not(#content-container) h1'):
    jobMessage = item.css('::text').extract()


    大概就是這麼多了,這篇文章主要是寫了css選擇器的使用。 有時候css , xpath選擇器組合使用,可以簡單的獲取到數據。有時間的話我會再寫一篇xpath選擇器的用法

    熱門文章