簡體   English   中英

Scrapy-簡單div [@class] response.xpath屬性不返回數據

[英]Scrapy - Simple div[@class] response.xpath attribute not returning data

我已經編寫了一些簡單的代碼,以便從Indeed搜索頁面結果中獲取HTML鏈接。 我的起始網址是一個提供招聘廣告列表的http地址。 我正在嘗試抓取頁面上顯示的每個作業的URL和職位名稱。 我的問題似乎是titles = response.xpath屬性。 如果使用作業特定的屬性,則會得到數據,但是當我在代碼中使用下面顯示的屬性時,我什么也收不到(甚至列標題也沒有)。 盡管事實上該屬性包含了我需要的所有內容。 任何幫助都值得歡迎,因為我只是一個初學者。

我正在輸出到CSV文件,並且已經在其他地方成功使用了此代碼,所以我想知道這是否與他們編碼目標URL頁面的方式有關。 真讓我發瘋!

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]

    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles = response.xpath('//div[@class="jobsearch-SerpJobCard row result clickcard"]')

        items = []
        for titles in titles:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = titles.xpath('//h2/a/text()').extract()

            items.append(item)
        return items

感謝Elena的指導,但恐怕您的建議沒有任何作用。 我仍然沒有數據返回。 我已經解決了重復變量( 對於title1中的標題 ),我將其作為獨立更改進行了令人滿意的測試。 但是,其他建議沒有區別。 我還嘗試過僅通過請求返回URL來運行抓取工具,但仍然無法正常工作。 修改后的示例如下。

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]

    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles1 = response.css('div.jobsearch-SerpJobCard.row.result.clickcard')
        #also tried as titles = response.css('div.jobsearch-SerpJobCard row result clickcard')

        items = []
        for titles in titles1:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = titles.xpath('.//h2/a/text()').extract()
        #also tried as item ['role_titletext'] = titles.css('h2 a::text').extract()
            items.append(item)
        return items

編輯:謝謝Thiago。 真是破解! 你是超級巨星! 感謝您和Elena對新手的耐心配合。 只是為了完成對其他任何人的交流,我使用的最終代碼如下。 這將返回搜索頁面網址和職位:-);

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]
    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles = response.css('.jobsearch-SerpJobCard')
        items = []
        for titles in titles:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = title.xpath('.//h2/a/@title').extract()
        items.append(item)
        return items

我注意到下載的HTML代碼中沒有clickcard類,但是在頁面加載之后就存在。 當然,它是由一些javascript代碼添加的。 由於Scrapy無法執行javascript,因此當某些選擇器意外失敗(而不是“檢查元素”)時,您可能需要仔細檢查頁面源。 除此之外,一個較短的選擇器(如“ .jobsearch-SerpJobCard”)可以完成這項工作。

關於標題中的問題,要獲取屬性數據,可以使用xpath('.//div/@class')css('div::attr(class)') 例如:

def parse(self, response):
    titles = response.css('.jobsearch-SerpJobCard')
    for title in titles:
        item = {}
        item['role_titletext'] = title.xpath('.//h2/a/@title').get()
        # or
        # item['role_titletext'] = title.css('h2 a::attr(title)').get()
        yield item

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM