글쎄, 메인 문제는 그 점에서 다른 사람들보다 실제로 더 똑똑하다는 것을 자랑스럽게 여기는 사이트에서 부적절하게 만들어진 비 호환 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" ...
문제는 HTML이고 어떻게'libxm2'가 그것을 패치했는지'phantomjs' 증명해 주셔서 대단히 감사합니다. 그러나 문제를 해결하기 위해 실제로 코드를 패치 (추가/제거)하는 방법을 찾지 못했습니다. 문제의 원인이되는 태그를 찾으셨습니까? –
또한 태그를 수정하여 질문을 수정 해 주셔서 감사합니다. –
셀레늄이나 유령 리는 시스템을 사용하기에는별로 나쁘지 않습니다. 나는 의사의 구조적 변화를 비교할 시간을 갖기 위해 노력할 것이다. – hrbrmstr