[英]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.