2012-08-30 10 views
0

웹 사이트에서 판매 된 자산 데이터를 얻기 위해 Scrapy 및 xpaths를 사용하고 있습니다. 대리점, 대행사, 주소, 부동산 유형, 침실, 욕실 및 전체 URL)과 페이지 당 20 개의 레코드가 총 9 가지 '품목'(판매 가격, 판매일, 대리인, 대행사, 주소)이 있습니다. 그런 다음 결과를 SQLite3 데이터베이스에 보관합니다.Python, Scrapy 및 Xpath 관련,

약간 불완전한 데이터가있는 페이지를 칠 때까지 모든 것이 완벽하게 작동합니다. 하나의 레코드에서 변수가 누락되면 모든 것을 스크류하고 페이지의 아무 것도 데이터베이스에 기록되지 않습니다.

나는 'unpythonic'방식으로 코딩했기 때문에이 문제에 대한 해결책 (pythonic 또는 다른 방법)을 찾을 수 없기 때문에 이것이 확실하다고 확신합니다.

def process_item(self, item, spider): 

    self.cur.execute("CREATE TABLE IF NOT EXISTS Diditwork(Id INTEGER PRIMARY KEY, SalePrice TEXT, Address TEXT, Agent TEXT, Agency TEXT, DateSold TEXT, TypeOfProperty TEXT, Bedrooms TEXT, Bathrooms TEXT, FullURL TEXT)") 
    n=int(0) 
    for data in item['address']: 

     self.cur.execute("INSERT INTO Diditwork (Saleprice, Agent, Agency, Address, DateSold, TypeOfProperty, Bedrooms, Bathrooms, FullURL) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", ((item['saleprice'][n]), (item['agent'][n]), (item['agency'][n]), (item['address'][n]), (item['datesold'][n]), (item['typeofproperty'][n]), (item['bedrooms'][n]), (item['bathrooms'][n]), (item['fullurl'][n]))) 

     self.conn.commit() 
     n +=1 

    return item 

변수가 기록에서 누락되었을 때 내가 오류입니다 'exceptions.IndexError : 밖으로리스트 인덱스

상황이 보인다 내 pipelines.py 파일의 일부가 잘못 갈 것입니다 범위 '

내 루프가 작성된 방식 때문이라고 생각합니다. 20 개의 변수가있는 목록을 찾지 만, 하나 이상의 레코드가 불완전하거나없는 경우 일부 페이지에서는 존재하지 않는 목록 인덱스를 호출하려고 시도합니다.

예를 들어 한 페이지에는 20 개의 주소 레코드가 있지만 15 개의 에이전트 레코드 만있을 수 있습니다. 항목 [ 'agent'] [16]을 호출하려고 시도한 다음 그 목록이 그리 길지 않기 때문에 오류가 발생합니다.

어쨌든 내 문제에 대한 잘못된 설명에 사과드립니다.

if len(item['address']) != len(item['agent']): 
      #item['agent'] = ["not available"] * 20 

또는 내 모든 접근 방식이 잘못되었는지 여부를 잘 모르겠습니다.

모든 도움을 주시면 감사하겠습니다. 저는이 문제를 해결하기 위해 하루 반 정도 더 노력하고 있습니다.

편집 : 감사합니다. 나는 여전히 더 많은 테스트를해야하지만, 실제로이 문제를 생각해 냈습니다. 여기 제가 사용하고있는 코드가 있습니다. 누군가가 좀 더 우아한 해결책을 제시 할 경우를 대비해 24 시간 동안 답변을하지 않겠습니다.

if len(item['address']) != len(item['agent']): #error checking 
      difference = len(item['address']) - len(item['agent']) #find the disparity 
      item['agent'].extend(["not available"] * difference) #append/extend the list by an appropriate number 

답변

0

접근 방식이 작고 코드가 적어 처리가 적어 잘 작동합니다. 당신이 부족한 것은 적절한 검증입니다. db에 입력 된 모든 데이터의 유효성을 검사해야하며 길이뿐만 아니라 구문 분석 및 저장 전에 유효성을 검사하고 수정해야하는 필드 유형도 확인해야합니다.

+0

답장을 보내 주셔서 감사합니다. 당신은 정교 할 수 있습니까? 추천할만한 독서물이 있습니까? – Jonathan

+0

엄밀히 말하면; SQLite는 (INTEGER PRIMARY KEY 칼럼을 제외하고) 타입이나 길이 검증을 시행하지 않습니다. 그러나 여전히 유효성을 검사하는 것은 아주 좋은 생각입니다. –

+0

유효성을 검사하는 가장 좋은 방법에 대한 단서가 있습니까? len()의 불일치가 item [ 'address']과 item [ 'agent'] 사이에 있는지 확인한 다음 item [ 'agent']에 "data not available"과 같은 것을 추가해야합니다. 횟수? 나는 올바른 길을 가고 있는가? Donal 답장을 보내 주셔서 감사합니다. – Jonathan