2016-09-25 3 views
1

저는 XPath와 Scrapy의 초보자입니다. 고유 한 클래스가없는 노드 (예 : class="pubBody")를 타겟팅하려고합니다.XPath는 빈 목록을 반환합니다. 타겟 div 요소를 무시하는 이유는 무엇입니까?

은 이미 시도 : xpath not contains A and B

이것은 간단한 작업해야하지만, XPath는 단지 두 번째 항목이 골대를 벗어났습니다. 나는이 치료 껍질에서 이것을하고있다. 명령 프롬프트에서 다음을

scrapy 쉘 "http://www.sciencedirect.com/science/journal/00221694/"

나는 두 번째 DIV 찾고 있어요 :

<div id="issueListHeader" class="pubBody">...< /div> 

<div class="pubBody">... < /div> 

가 난 단지 두 번째 첫 번째가 아닌를 얻을 수 있습니다. 비슷한 질문에 대한 최선의 답변은 다음과 같은 것을 시도해 볼 것을 제안했습니다 :

hxs.xpath('//div[contains(@class,"pubBody") and not(contains(@id,"issueListHeader"))]') 

그러나 이것은 어떤 이유로 빈 목록을 반환합니다. 어떤 도움을 주시겠습니까? 어리석은 무엇인가 놓치고 있어야한다, 나는 이것을 날 동안 시험해 보았다!

기타 상세 사항 : scrapy 쉘에서 일단

:

첫 번째 div 요소에 대해서만 작동
import scrapy 

xs = scrapy.Selector(response) 

hxs.xpath('//div[@class="pubBody"]') 

: 나는 또한했습니다 실패한 두 번째 div 요소에 대한

[<Selector xpath='//div[@class="pubBody"]' data='<div id="issueListHeader" class="pubBody'>] 

시도 :

hxs.xpath('//div[@class="pubBody" and not(@id="issueListHeader")]').extract_first() 

hxs.xpath('//div[starts-with(@class, "pubBody") and not(re:test(@id, "issueListHeader"))]') 

또한 직접 크롬에서 XPath를 복사뿐만 아니라, '[]'반환

hxs.xpath('//*[@id="issueList"]/div/form/div[2]') 
+0

http://stackoverflow.com/questions/38447738/beautifulsoup-html5lib-module-object-has-no-attribute-base –

답변

1

문제는 HTML이이 페이지에서 잘 형성되고 있지 않다는 것입니다..그래서

In [6]: len(response.css(".pubBody")) 
Out[6]: 1 

In [7]: len(soup.select(".pubBody")) 
Out[7]: 2 

:

In [1]: from bs4 import BeautifulSoup 

In [2]: soup = BeautifulSoup(response.body, 'html5lib') # note: "html5lib" has to be installed 

In [3]: len(soup.select(".article h4 a")) 
Out[3]: 94 

In [4]: len(response.css(".article h4 a")) 
Out[4]: 0 

같은 당신의 위치를하려고하는 pubBody 요소에 간다 : 입증하기 위해, 똑같은 CSS 선택기 Scrapy와 0 결과를 생산하고 94 BeautifulSoup에서 생산하는 방법을 알아보십시오 BeautifulSoup을 연결하여 HTML을 수정/정리하십시오. 이상적으로는 middleware입니다.


내가 만든 간단한 scrapy_beautifulsoup middleware 쉽게 프로젝트에 훅하기 :

pip install scrapy-beautifulsoup 
  • 구성 settings.py의 미들웨어 :

    • 이 핍을 통해 설치

      DOWNLOADER_MIDDLEWARES = { 
          'scrapy_beautifulsoup.middleware.BeautifulSoupMiddleware': 543 
      } 
      BEAUTIFULSOUP_PARSER = "html5lib" 
      

    이익.

  • +1

    감사합니다. @alecxe! 미들웨어가 그 일을했습니다 !! 추신. 또한 4.4.1에서 4.5.1로 업그레이드 한 후에도 아름다운 스프가 업데이트되지 않는 문제가있었습니다 (http://stackoverflow.com/questions/38447738/beautifulsoup-html5lib-module-object-has-no-attribute -base) 사이드 노트 : GitHub "readme"청크에서 settings.py 변경 사항을 두 코드 청크로 분리합니다. 하나의 덩어리에서 두 가지 설정을 변경하면 (이 답변에있는 것처럼) 새내기에 대해 더 쉽게 이해할 수 있습니다! 다시 한 번 감사드립니다! –

    0

    나는 문제가 you'r이 (http://www.sciencedirect.com/science/journal/00221694/를) 구문 분석을 시도 페이지의 소스에 의한 유효한 XML이 아니라고 의심 <link ...> 노드/요소/태그에 닫는 태그가 없습니다. 다른 문제가있을 수 있지만 처음 발견 된 문제입니다.

    자바 스크립트에서는 녹슬지 만 사이트의 하위 레벨 (예 : 대상 또는 몸 가까이에있는 다른 노드)에서 DOM을 탐색 한 다음 그 수준의 XPath.

    업데이트 : 난 그냥 문서의 <head>을 제거하고 XML 파서를 통과 시도하고 그것은 여전히 ​​단절에 폐쇄되지 않은 <input> 노드를 나누기. 닫는 태그를 닫는 특수 JavaScript XML/XPath 규칙 메서드를 잊지 않는 한, JQuery와 같은 것을 사용하여 찾고자하는 요소를 찾는 것이 더 나을지도 모른다.

    관련 문제