2014-12-01 2 views
1

일부 텍스트 데이터를 추출하는 데 scrapy 쉘을 사용하고 있습니다. 다음은 치료 껍질에서 내가 준 명령입니다.Scrapy response.xpath가 쿼리에 대해 아무것도 반환하지 않습니다.

>>> scrapy shell "http://jobs.parklandcareers.com/dallas/nursing/jobid6541851-nurse-resident-cardiopulmonary-icu-feb2015-nurse-residency-requires-contract-jobs" 

>>> response.xpath('//*[@id="jobDesc"]/span[1]/text()') 
[<Selector xpath='//*[@id="jobDesc"]/span[1]/text()' data=u'Dallas, TX'>] 
>>> response.xpath('//*[@id="jobDesc"]/span[2]/p/text()[2]') 
[<Selector xpath='//*[@id="jobDesc"]/span[2]/p/text()[2]' data=u'Responsible for attending assigned nursi'>] 
>>> response.xpath('//*[@id="jobDesc"]/span[2]/p/text()[preceding-sibling::*="Education"][following-sibling::*="Certification"]') 
[] 

세 번째 명령은 데이터를 반환하지 않습니다. 명령에서 2 개의 키워드 사이에서 데이터를 추출하려고했습니다. 내가 어디가 잘못 됐니?

답변

1

//*[@id="jobDesc"]/span[2]/p/text()은 텍스트 노드 목록을 반환합니다. 파이썬에서 관련 노드를 필터링 할 수 있습니다. 다음은 사이에 텍스트를 얻을 수있는 방법이다 "학력/경력 :""인증/등록/면허은" 텍스트 단락 :

>>> result = response.xpath('//*[@id="jobDesc"]/span[2]/p/text()').extract() 
>>> start = result.index('Education/Experience:') 
>>> end = result.index('Certification/Registration/Licensure:') 
>>> print ''.join(result[start+1:end]) 
- Must be a graduate from an accredited school of Nursing. 

UPD (주석 추가 질문에 대한) :

>>> response.xpath('//*[@id="jobDesc"]/span[3]/text()').re('Job ID: (\d+)') 
[u'143112'] 
+0

이 질문에 대한 질문이 하나 더 있습니다. 나는 다음과 같은 것을 시도했다 : >>> jid = response.xpath ('// * [@ id = "jobDesc"]/span [3]/text()'). 숫자 만 추출하고 "작업 ID :"를 제거하십시오 ... 그러나 시작은 같은 방식으로 작동하지 않습니다 .. 색인이 목록에 없습니다 – Abhishek

+1

@crozzfire 확실히, 이것은 ['.re ')'] (http://doc.scrapy.org/en/latest/topics/selectors.html#using-selectors-withregular-expressions)에서 답을 찾아보십시오. – alecxe

0

시도 :

substring-before(
    substring-after('//*[@id="jobDesc"]/span[2]/p/text()', 'Education'), 'Certification') 

참고 : 나는 그것을 테스트 할 수 있습니다.

같은 텍스트 노드를보고 있기 때문에 preceding-siblingfollowing-sibling을 사용할 수 없다는 아이디어가 있습니다. substring-before()substring-after()

이 두 기능을 결합하여 사이에있는 것을 선택하면 원하는 텍스트 부분을 추출해야합니다.

관련 문제