2017-09-12 6 views
0
import java.io.IOException; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 


public class Main { 
    public static void main(String[] args) throws Exception { 
     Document d=Jsoup.connect("https://osu.ppy.sh/u/charless").get(); 

     for(Element line : d.select("div.profileStatLine")) { 
      System.out.println(d.select("b").text()); 
     } 
    } 
} 

div.profileStatLine에서 "2027pp ​​(# 97,094)"텍스트를 가져 오는 데 문제가 있습니다. b. 이것은 출력되어야하지만하지 않습니다. URL : https://osu.ppy.sh/u/charlessJSoup : 요소에서 텍스트 가져 오는 중 문제가 발생했습니다.

+1

무엇이 문제입니까? – Reimeus

+0

아무 것도 출력하지 않으며 질문에 추가됩니다. –

+0

[페이지 콘텐츠가 자바 스크립트로로드되어 Jsoup에서 볼 수 없음] (https://stackoverflow.com/questions/7488872/page-content-is-loaded-with-javascript-and-jsoup-doesnt- see-it) – teppic

답변

1

페이지의 일부가 자바 스크립트로로드되어 있기 때문에 찾고있는 div가 보이지 않습니다.

브라우저를 사용하여 페이지를로드하고 구문 분석하기 전에 자바 스크립트를 해석 할 수 있습니다. webdrivermanager과 같은 도서관이 도움이 될 것입니다.

public static void main(String[] args) throws Exception { 
    ChromeDriverManager.getInstance().setup(); 
    ChromeDriver chromeDriver = new ChromeDriver(); 
    chromeDriver.get("https://osu.ppy.sh/u/charless"); 

    Document d = Jsoup.parse(chromeDriver.getPageSource()); 

    chromeDriver.close(); 

    for (Element line : d.select("div.profileStatLine")) { 
     System.out.println(line.select("b").text()); 
    } 
} 

대체 방법은 페이지의 자바 스크립트를 검사하여 데이터를 검색하는 것과 동일한 호출을 수행하는 것입니다.

페이지가 https://osu.ppy.sh/pages/include/profile-general.php?u=4084042&m=0에서 프로필을로드하고 있습니다. u은 간단히 페이지에서 추출하기가 비교적 간단한 사용자 ID입니다 :

public class ProfileScraper { 
    private static final Pattern UID_PATTERN = Pattern.compile("var userId = (\\d+);"); 

    public static void main(String[] args) throws IOException { 
     String uid = getUid("charless"); 
     Document d = Jsoup.connect("https://osu.ppy.sh/pages/include/profile-general.php?u=" + uid).get(); 

     for (Element line : d.select("div.profileStatLine")) { 
      System.out.println(line.select("b").text()); 
     } 
    } 

    public static String getUid(String name) throws IOException { 
     Document d1 = Jsoup.connect("https://osu.ppy.sh/u/" + name).get(); 

     for (Element script : d1.select("script")) { 
      String text = script.data(); 
      Matcher uidMatcher = UID_PATTERN.matcher(text); 
      if (uidMatcher.find()) { 
       return uidMatcher.group(1); 
      } 
     } 
     throw new IOException("No such character"); 
    } 
} 
+0

그래서 나는 달렸다. 문제는 내가 만들고있는 프로그램이 결국 서버에 배치되는 봇이므로이 방법이 해당 환경에서 계속 작동하는지 궁금합니다. –

+0

셀레늄은 아무런 문제없이 헤드리스로 작동하지만, 현재하고있는 일에 상당히 무거울 것입니다. 귀하의 다른 옵션은 페이지를 리버스 엔지니어링하고 당신이 이후에 콘텐츠를로드하기 위해 자바 스크립트가 무엇을 하는지를 발견하는 것입니다. – teppic

+0

나는 대체 접근법을 추가하기위한 해답을 편집했다. – teppic