我一直在嘗試抓取一些資料,但一直得到一個空白值或無。我試過做下一個兄弟姐妹但失敗了(我可能做錯了)。非常感謝任何和所有幫助。先感謝您。
抓取網站(最終版):https : //www.unegui.mn/azhild-avna/ulan-bator/
測驗網站(當前,串列較少):https : //www.unegui.mn/azhild-avna/mt-hariltsaa-holboo/slzhee-tehnik-hangamzh/ulan-bator/
代碼片段:
def parse(self, response, **kwargs):
cards = response.xpath("//li[contains(@class,'announcement-container')]")
# parse details
for card in cards:
company = card.xpath(".//*[@class='announcement-block__company-name']/text()").extract_first()
date_block = card.xpath("normalize-space(.//div[contains(@class,'announcement-block__date')]/text())").extract_first().split(',')
date = date_block[0]
city = date_block[1]
item = {'date': date,
'city': city,
'company': company
}
HTML 片段:
<div class="announcement-block__date">
<span class="announcement-block__company-name">Электро экспресс ХХК</span>
, ?чигд?р 13:05, Улаанбаатар</div>
預期輸出:
date = ?чигд?р 13:05
city = Улаанбаатар
更新:我想出了如何獲取我的日期和城市資料。我最終使用跟隨下一個兄弟來獲取日期,用逗號分割,并獲得第二個和第三個值。
date_block = card.xpath("normalize-space(.//div[contains(@class,'announcement-block__date')]/span/following-sibling::text())").extract_first().split(',')
date = date_block[1]
city = date_block[2]
額外的:
如果有人能告訴我或推薦我如何設定我的管道檔案,將不勝感激。使用管道是否正確還是應該使用 items.py?目前我在同一個專案檔案夾中有 3 個蜘蛛:公寓、作業、汽車。我需要清理我的資料并轉換它。例如,對于我目前正在處理的作業蜘蛛,如上所示,我想創建以下操作:
- 如果薪水 < 1000,則用字串 'Negotiable' 替換
- 如果日期包含文本“?чигд?р”,則替換為“昨天”而不洗掉時間
- 如果雇主包含值“Хувь х?н”,則將公司值更改為“Хувь х?н”
我的 pipelines.py 檔案:
from itemadapter import ItemAdapter
class ScrapebooksPipeline:
def process_item(self, item, spider):
return item
我的 items.py 檔案:
import scrapy
class ScrapebooksItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
uj5u.com熱心網友回復:
- 我將您的 xpath 更改為較小的范圍。
- extract_first() 將獲得第一個實體,因此請改用 getall()。
- 為了獲得日期,我不得不使用正則運算式(大多數結果都有時間但沒有日期,所以如果日期為空白,那就完全沒問題)。
- 我看不懂語言,所以我不得不猜測(有點)這個城市,但即使是錯誤的,你也能明白這一點。
import scrapy
import re
class TempSpider(scrapy.Spider):
name = 'temp_spider'
allowed_domains = ['unegui.mn']
start_urls = ['https://www.unegui.mn/azhild-avna/ulan-bator/']
def parse(self, response, **kwargs):
cards = response.xpath('//div[@]')
# parse details
for card in cards:
company = card.xpath('.//span/text()').get()
date_block = card.xpath('./text()').getall()
date = date_block[1].strip()
date = re.findall(r'(\d -\d -\d )', date)
if date:
date = date[0]
else:
date = ''
city = date_block[1].split(',')[2].strip()
item = {'date': date,
'city': city,
'company': company
}
yield item
輸出:
[scrapy.core.scraper] DEBUG: Scraped from <200 https://www.unegui.mn/azhild-avna/ulan-bator/>
{'date': '2021-11-07', 'city': 'Улаанбаатар', 'company': 'Arirang'}
[scrapy.core.scraper] DEBUG: Scraped from <200 https://www.unegui.mn/azhild-avna/ulan-bator/>
{'date': '2021-11-11', 'city': 'Улаанбаатар', 'company': 'Altangadas'}
[scrapy.core.scraper] DEBUG: Scraped from <200 https://www.unegui.mn/azhild-avna/ulan-bator/>
...
...
...
uj5u.com熱心網友回復:
看起來您缺少縮進??。反而
def parse(self, response, **kwargs):
cards = response.xpath("//li[contains(@class,'announcement-container')]")
# parse details
for card in cards: date_block = card.xpath("normalize-space(.//div[contains(@class,'announcement-block__date')]/text())").extract_first().split(',')
date = date_block[0]
city = date_block[1]
嘗試這個:
def parse(self, response, **kwargs):
cards = response.xpath("//li[contains(@class,'announcement-container')]")
# parse details
for card in cards: date_block = card.xpath("normalize-space(.//div[contains(@class,'announcement-block__date')]/text())").extract_first().split(',')
date = date_block[0]
city = date_block[1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361667.html
上一篇:ValueError:60列傳遞,傳遞的資料有282列
下一篇:無法抓取發現銀行頁面
