2013-02-15 2 views
3

나는 정말 기본 설정, CrawlSpider에서 서브 클래스 거미와 세 개의 필드는 다음과 같이 찾고 항목을 내 거미는 웁니다 응답을 구문 분석왜 치료의 분야는 사전입니까? 기본적으로

class AppdexItem(Item): 
    name = Field() 
    url = Field() 
    desc = Field() 

이 같은 항목 :

i = AppdexItem() 
name = hxs.select("//h1[@class='doc-banner-title']/text()") 
i['name'] = name.extract()[0] 

Field가 실제로 무엇인지 읽을 때 혼란스러워졌습니다. 이것은 말 그대로 its implementation입니다 :

class Field(dict): 
    """Container of field metadata""" 

그것은 일반 간단한 dict입니다. 왜 그런지 궁금해하고 잠시 구현을 보았습니다. 여전히 의미가 없습니다. 그래서 나는 항목으로 구문 분석했는데 한 페이지에 scrapy shell를 실행하고이는 내가 가진 무엇 :

In [16]: item = spider.parse_app(response) 

In [17]: item.fields 
Out[17]: {'desc': {}, 'name': {}, 'url': {}} 

In [18]: item['name'] 
Out[18]: u'Die Kleine Meerjungfrau' 

무엇입니까? 나는 완전히 잘못된 것을하고있다. (나는 공식 자습서와 예제를 통해 모든 것을했다.) 또는 Fielddict 인 것은 완전히 무의미하다.

누군가 나에게 설명 할 수 있습니까?

+2

'dict'은 파이썬에서 가장 최적화 된 데이터 구조 중 하나라는 점을 고려할 때 더 나은 질문은 "Scrapy가 필드 메타 데이터를 저장하는 데 사용해야하는 데이터 구조 *"입니다. – bernie

+0

@bernie'Field'는'dict'으로 사용되지 않습니다. 따라서 데이터 구조가 최적화 된 'dict'은 중요하지 않습니다. 대신'Item'은 이전에'Field'로 정의한 키에 할당 된 값을 저장하는'dict'으로 사용됩니다. 내가 볼 수있는 한,'Item'은 그냥'namedtuple' 일 수 있습니다. – dAnjou

답변

6

역사적인 이유. 이전에는 사전에 저장된 필드에 메타 데이터가 첨부되었습니다. 나는 편리한 (key = value) 생성자가 있기 때문에 dict가 사용되었다고 가정합니다. 이 마지막 사용이 this commit에서 제거 된 것을 볼 수 있습니다. 이 시점에서 약간의 차이가 있으며 단순한 객체 일 수 있습니다 (어떤 이유로 든 dict이라는 가정하에 코드를 수정하는 것이 어려울 수 있지만).

3

필드 이고 메타 데이터를 저장하는 데 사용됩니다. 하나의 사용 사례는 ItemLoader에 대한 입력 및 출력 프로세서를 지정하는 것입니다. http://doc.scrapy.org/en/master/topics/loaders.html#declaring-input-and-output-processors을 확인하십시오.

필자는 개인적으로 Scrapy가 메타 데이터없이 일반 dicts를 지원하는 것이 좋을 것이라고 생각하지만 다른 질문입니다.

관련 문제