2017-10-24 1 views
0

여러 EU 사이트에서 일부 데이터를 긁어내어 response.xpath()에 대한 내 전화가 텍스트를 위반하는 경우가 있습니다. 예를 들어, "& amp;" &#164과 같은 html 엔티티와 \x92 또는 \xc3 등과 같은 깨진 바이트로 번역 된 것으로 나타났습니다. xpath 메소드 (lxml lib 사용)를 호출하기 전에 일부 실용적인 해결책을 발견했습니다. 다음과 같이 보입니다 :미들웨어에서 scrapy Response 객체를 수정할 수 있습니까?

body_str = str(response.body, response._body_declared_encoding()) 
unescaped_body = html.unescape(body_str) 
response = response.replace(body=unescaped_body) 

응답 처리를 위해 콜백이 시작될 때 즉시 호출되는 코드가 있으면 잘 작동하는 것 같습니다.

내가 지금 할 노력하고있어 각 요청 또는 다른 거미 등이 접근 방식을 사용, 스파이더 미들웨어에이 코드를 이동하는 것입니다 그러나 문제는이 코드가

안에 응답 객체를 수정하지 않는다는 것입니다
def process_spider_input(self, response, spider): 

response = response.replace(...)은 다른 지역에서 사용되지 않는 새로운 로컬 변수 응답을 생성합니다. 그리고 내 질문에 제목입니다 : 나는 거미 미들웨어 안의 응답 객체를 수정할 수 있습니까?

답변

0

process_response 메서드를 사용하여 Downloader Middleware을 사용하고 Response 개체를 반환하는 것이 좋습니다.

... 
def process_response(self, request, response, spider): 
    ... 
    body_str = str(response.body, response._body_declared_encoding()) 
    unescaped_body = html.unescape(body_str) 
    new_response = response.replace(body=unescaped_body) 
    return new_response 
+0

감사합니다. 맞습니다. 다운로더 미들웨어는 Response 객체를 대체하기에 완벽합니다. Unfortuanlly 미들웨어에서'_body_declared_encoding()'(None을 반환)을 사용할 수 없기 때문에 내 특정 솔루션이 제대로 작동하지 않았습니다. 그리고 response.body는 아직 원시이며 가능한 gziped 바이트 객체입니다. 나는 이것에 대해 더 많이 배우고 새로운 해결책을 찾으려고 노력할 것이다. 더 많은 답변을 주셔서 감사합니다. –

관련 문제