2016-08-03 5 views
-4

Scrapy는 웹 크롤러이며 거미를 만들었습니다. 거미가 2 개의 링크 본문이있는 2 개의 html 파일을 만들길 원합니다. 생성 된 html 파일이 비어 있습니다.이 xpath 표현식이 작동하지 않는 이유는 무엇입니까?

import scrapy 
    from scrapy.selector import Selector 
    from scrapy.http import HtmlResponse 

    class DmozSpider(scrapy.Spider): 
     name = "dmoz" 
     allowed_domains = ["dmoz.org"] 
     start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
] 

     def parse(self, response): 
      x=response.xpath("//body/text()").extract() 
      filename = response.url.split("/")[-2] + '.html' 
      with open(filename, 'wb') as f: 
       f.write(x) 

답변

-1

Scrapy tutorial을 다시 방문하여 다시 확인하십시오. 귀하의 예는 기본적으로 dmoz_spider.py의 축 어적 사본입니다.

우선 xpath()은 선택자 목록을 반환합니다. 선택기 목록에 extract()을 호출하면 유니 코드 문자열 목록이 제공되며 이는 파일에 그대로 쓸 수 없습니다. 문자열을 결합하고 결과를 인코딩해야합니다 (예 : UTF-8 사용).

with open(filename, 'wb') as f: 
    f.write(u"".join(x).encode("UTF-8")) 

현재 작동하지 않는 이유는 XPath 식을 사용하여 body 요소의 모든 텍스트 노드를 선택하는 것입니다. 텍스트 노드에는 공백 문자 만 포함되므로 생성 된 파일은 비어있는 것처럼 보입니다.

response.xpath("//body/text()").extract()의 결과는 [u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n ', u'\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ']이므로 파일에 공백 문자가 포함되어야합니다.

body 요소 아래의 모든 노드를 선택하려면 response.xpath("//body/node())을 사용하십시오.

예 : 모든 div 요소를 선택하고 클래스를 사용하려면 response.xpath("//div[@class = 'hero']")을 사용하십시오.

아마도 XPath에 대한 기본 자습서를 먼저 읽어야합니다. 여기서 배우는 것은 여기서 작동하지 않을 것입니다. 기본을 바로 잡아야합니다.

+0

body를 복사하는 데 사용할 다른 xpath 표현식은 무엇입니까? response.xpath ("// body"). 추출()을 시도했으나 작동하지 않았습니다. response.body는 작동하지만 xpath를 배우고 싶습니다. – user6658170

+0

정확히 HTML 파일로 끝날 것으로 예상되는 질문에 대해 명확하게 설명하면 도움이됩니다. 서버가 반환 한 디스크에 디스크를 쓰려면 XPath가 전혀 필요하지 않습니다. – Markus

+0

html 파일에 body 요소가 있어야합니다. 그 작업을 수행하면 특정 클래스가있는 모든 div 요소를 수집하게됩니다. – user6658170

관련 문제