2016-10-19 8 views
0

나는이 코드를 사용하여 몇백 페이지를 긁어 낸다. 그러나 때로는 a에 대한 xpath가 전혀 존재하지 않습니다. 스크립트를 중단하지 않고 계속 실행하여 b을 얻고 그 특정 페이지에 대해 알려 주면 어떻게 편집 할 수 있습니까?Python Scrapy : 없으면 Xpath 건너 뛰기

`a = response.xpath("//div[@class='headerDiv']/a/@title").extract()[0] 
b = response.xpath("//div[@class='headerDiv']/text()").extract()[0].strip() 
items['title'] = a + " " + b 
yield items` 

답변

1

extract()의 결과를 확인하십시오.

a = response.xpath("//div[@class='headerDiv']/a/@title").extract_first(default='') 
b = response.xpath("//div[@class='headerDiv']/text()").extract_first(default ='').strip() 
items['title'] = (a + " " + b).strip() 
yield items 
+0

'extract_first (기본값 = '')'하지만 당신은 추가 예정 공백이 존재하지 않으면 a가 존재하지 않으므로 a가 존재할 경우에만 a와 b 만 연결하거나 b를 추가해야합니다. –

+0

'(a + ''+ b) .strip()은 a가 일치하지 않을 때 catch합니다. 또한 첫 번째 문자를 얻는 것처럼 문자열을 반환하므로 extract_first를 색인화하지 않으려합니다. –

+0

감사합니다. –

0

당신은 다음과 같이 사용할 수 있습니다 : Padraic 커닝햄의 좋은 충고와

nodes = response.xpath("//div[@class='headerDiv']/a/@title").extract() 
a = nodes[0] if nodes else "" 

nodes = response.xpath("//div[@class='headerDiv']/text()").extract() 
b = nodes[0].strip() if nodes else "" 

items['title'] = a + " " + b 
yield items 

import lxml.etree as etree 

parser = etree.XMLParser(strip_cdata=False, remove_comments=True) 
root = etree.fromstring(data, parser) 

#Take Hyperlink as per xpath: 
#But Xpath returns list of element so we have to take 0 index of it if it has element 

a = root.xpath("//div[@class='headerDiv']/a/@title") 
b = response.xpath("//div[@class='headerDiv']/text()") 

if a: 
    items['title'] = a[0].strip() + " " + b[0].strip() 
else: 
    items['title'] = b[0].strip() 

yield items 
관련 문제