2017-01-08 10 views
0

내가 왜이 코드를 대상 <div> 요소의 범위를 벗어R : 더 많은 노드를 추출 xml2는

library(rvest) 
u <- "http://alistapart.com/article/daemonskin" 
h <- read_html(u) 
html_nodes(h, "div.main-content[itemprop='articleBody'] a") %>% 
    html_attr("href") 

일치 많은 URL을 이해하지 못하고 예상보다.

당신이 target page의 HTML 소스를 보면 :이

  • 하나의 <div> 내 쿼리와 일치합니다. 그것은 라인에 라인 177
  • <div> 정지에서 시작 396
  • 위의 그 <div>의 외부, 그 선을 넘어 노드에서 추출 된 코드에서 html_nodes에 의해 반환 된 URL을하지만 많은.

참고 : 당신은 HTML의 라인 (242)에서, 결함 </div 요소가 그를 알 수 있습니다. 그러나 문제를 해결해도 문제가 해결되지 않는 것 같습니다.

xml2 (즉, libxml2)이 코드를 구문 분석하는 방법과 관련이 있다고 생각합니다.

다른 아이디어?

답변

1

글쎄, 메인 문제는 그 점에서 다른 사람들보다 실제로 더 똑똑하다는 것을 자랑스럽게 여기는 사이트에서 부적절하게 만들어진 비 호환 HTML입니다.

당신이 할 경우 : 기본 libxml2 라이브러리가 작은 HTML (XML) 오류 "를 고정"하고 일을 자신의 방법이있다

library(rvest) 
library(purrr) 

URL <- "http://alistapart.com/article/daemonskin" 

read_html(URL) %>% 
    html_nodes("div.main-content[itemprop='articleBody'] a") %>% 
    html_attr("href") %>% 
    str() 
## chr [1:74] "#comments" ... 

. 이러한 방법은 파서가 HTML을 "고정"하는 방식으로 인해 더 많은 요소가 대상이되는 <div>을 발생시킵니다.

당신은 우리가 셀레늄 시뮬레이션 할 수있는 실제 브라우저에서 결과의 차이를 볼 수 있습니다

:

참고 : 당신이 그렇게하면 내가 R

library(seleniumPipes) 

rd <- remoteDr(browserName = "phantomjs", port = 8910) 
rd %>% go(URL) 

외부 webdriver 모드에서 phantomjs 시작 phantomjs (웹킷, 실제로)는 브라우저 자체에서 HTML 구문 분석기 픽스 업 메서드를 HTML에 적용합니다 (페이지로드시 자바 스크립트 트리거를 기반으로 노드를 추가하거나 뺍니다).

당신이 (필자는 개발자 도구 콘솔에서 크롬에서 무엇을 가지고도 인) 당신이 (34)을 얻을 노드를 검색 할 document.querySelectorAll()의 등가를 사용하는 경우 :

rd %>% 
    findElements("css", "div.main-content[itemprop='articleBody'] a") %>% 
    map_chr(getElementAttribute, "href") %>% 
    str() 
## chr [1:34] "http://alistapart.com/article/daemonskin#comments" ... 

주 당신은 무엇을하기로 결정한 경우 I 일반적으로 getPageSource()을 사용하여 모든 선택/추출을 rvest/xml2 함수를 통해 수행하면 가상 브라우저에서 현재 HTML 페이지를 추출하여 read_html()으로 전달했기 때문에 결과가 달라집니다. libxml2에 추가 픽스 업을 적용합니다 이론적으로 이미 정리 된 웹킷 :

rd %>% 
    go(URL) %>% 
    getPageSource() %>% 
    html_nodes("div.main-content[itemprop='articleBody'] a") %>% 
    html_attr("href") %>% 
    str() 
## chr [1:32] "#comments" ... 
+0

문제는 HTML이고 어떻게'libxm2'가 그것을 패치했는지'phantomjs' 증명해 주셔서 대단히 감사합니다. 그러나 문제를 해결하기 위해 실제로 코드를 패치 (추가/제거)하는 방법을 찾지 못했습니다. 문제의 원인이되는 태그를 찾으셨습니까? –

+0

또한 태그를 수정하여 질문을 수정 해 주셔서 감사합니다. –

+0

셀레늄이나 유령 리는 시스템을 사용하기에는별로 나쁘지 않습니다. 나는 의사의 구조적 변화를 비교할 시간을 갖기 위해 노력할 것이다. – hrbrmstr