#python-2.7 #web-scraping #scrapy #web-crawler #scrapy-spider
#python-2.7 #очистка веб-страниц #веб-сканер #scrapy
Вопрос:
Я получил эту ошибку при запуске scrapy project my spider.py код — это
import scrapy
import re
from tutorial.items import TutorialItem
class tutorialSpider(scrapy.Spider):
name="tutorial"
allowed_domain=['examble.com']
start_urls = ["examble.com/something"]
def parse(self, response):
for sel in response.xpath('//*[@id="post-entry"]/div/article'):
item = TutorialItem()
item['Title'] = sel.xpath('div[2]/h2/a/text()').extract[0]
item['MainPageUrl'] = sel.xpath('div[2]/h2/a/@href').extract[0]
item['Author'] = sel.xpath('div[2]/div/span/a/text()').extract[0]
request = scrapy.Request(item['MianPageUrl'], callback=self.parseContentDetails)
request.meta['item'] = item
yield request
def parseContentDetails(self,response):
item = response.meta['item']
item['Content'] = response.xpath()
item['Count'] = response.xpath()
print type(item)
return item
и мой конвейер.py является
class TutorialPipeline(object):
def __init__(self):
#self.setupDBCon()
#self.createTables()
def process_item(self, item, spider):
for key, value in item.iteritems():
if(isinstance(value, list)):
if value:
templist = []
for obj in value:
temp = self.stripHTML(obj)
templist.append(temp)
item[key] = templist
else:
item[key] = ""
else:
item[key] = self.stripHTML(value)
print item.get('Title', '')
return item
и мой items.py есть
from scrapy.item import Item, Field
class TutorialItem(Item):
Title=Field()
Author = Field()
MianPageUrl = Field()
Content=Field()
Count=Field()
пожалуйста, подскажите мне решение этой ошибки. Я искал так много сайтов. эти сайты сообщают только о том, что объект instancemethod не имеет ошибки атрибута в django, но я хочу решение для scrapy
Комментарии:
1. Пожалуйста, опубликуйте свой результат трассировки, строки до (и включая
TypeError
строку)
Ответ №1:
Вы неправильно вызываете extract, для каждого извлечения вы должны фактически вызвать метод, а затем проиндексировать его:
item['Title'] = sel.xpath('div[2]/h2/a/text()').extract()[0]
^^^
Если вам нужен только первый элемент, вы можете просто использовать extract_first .
item['Title'] = sel.xpath('div[2]/h2/a/text()').extract_first()