2017-12-02 26 views
1

私はJsoup解析を初めて利用しています。 これを行う方法は、実際にはdivタグでページを検査することです私が必要とするものに関連しています。まず、私もでも私ならば、第二 (企業のリストを与えることになっているもの)、私のコンソルHTML出力にこれらのDIVタグを見つけることができませんクラスでdiv要素を取得するjsoup

Document doc = Jsoup.connect("https://angel.co/companies?company_types[]=Startup").get(); 
System.out.println(doc.html()); 

:私はメソッドを呼び出すしかし 、私はクラス名で特定のdiv要素を見つけることができるか、それを見つけた:

div class=" dc59 frw44 _a _jm" 

恩赦専門用語を、私はどのようにこれを通過する見当がつかない。

答えて

1

データはページ内に埋め込まれていないが、それらは、後続のAPI呼び出しを使用して取得されています

上記は1ページごとに繰り返されます(したがって、新しいトークン&ページごとにIDのリストが必要です)。このプロセスは、Chromeの[ネットワーク]タブのコンソールを使用して確認できます。

最初のPOSTリクエストはJSON出力を行いますが、2番目のリクエスト(GET)はJSONオブジェクトのプロパティにHTMLデータを与えます。

次は、会社フィルタを抽出します。

private static CompanyFilter getCompanyFilter(final String filter, final int page) throws IOException { 

    String response = Jsoup.connect("https://angel.co/company_filters/search_data") 
      .header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8") 
      .header("X-Requested-With", "XMLHttpRequest") 
      .data("filter_data[company_types][]=", filter) 
      .data("sort", "signal") 
      .data("page", String.valueOf(page)) 
      .userAgent("Mozilla") 
      .ignoreContentType(true) 
      .post().body().text(); 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    Gson gson = gsonBuilder.create(); 
    return gson.fromJson(response, CompanyFilter.class); 
} 

その後、次の抽出企業:

private static List<Company> getCompanies(final CompanyFilter companyFilter) throws IOException { 

    List<Company> companies = new ArrayList<>(); 

    URLConnection urlConn = new URL("https://angel.co/companies/startups?" + companyFilter.buildRequest()).openConnection(); 
    urlConn.setRequestProperty("User-Agent", "Mozilla"); 
    urlConn.connect(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8")); 
    HtmlContainer htmlObj = new Gson().fromJson(reader, HtmlContainer.class); 

    Element doc = Jsoup.parse(htmlObj.getHtml()); 
    Elements data = doc.select("div[data-_tn]"); 

    if (data.size() > 0) { 
     for (int i = 2; i < data.size(); i++) { 
      companies.add(new Company(data.get(i).select("a").first().attr("title"), 
        data.get(i).select("a").first().attr("href"), 
        data.get(i).select("div.pitch").first().text())); 
     } 

    } else { 
     System.out.println("no data"); 
    } 
    return companies; 
} 

主な機能:

public static void main(String[] args) throws IOException { 

    int pageCount = 1; 
    List<Company> companies = new ArrayList<>(); 

    for (int i = 0; i < 10; i++) { 

     System.out.println("get page n°" + pageCount); 
     CompanyFilter companyFilter = getCompanyFilter("Startup", pageCount); 
     pageCount++; 
     System.out.println("digest  : " + companyFilter.getDigest()); 
     System.out.println("count  : " + companyFilter.getTotalCount()); 
     System.out.println("array size : " + companyFilter.getIds().size()); 
     System.out.println("page  : " + companyFilter.getpage()); 

     companies.addAll(getCompanies(companyFilter)); 

     if (companies.size() == 0) { 
      break; 
     } else { 
      System.out.println("size  : " + companies.size()); 
     } 
    } 
} 

CompanyCompanyFilter & HtmlContainerがモデルですクラス:

class CompanyFilter { 

    @SerializedName("ids") 
    private List<Integer> mIds; 

    @SerializedName("hexdigest") 
    private String mDigest; 

    @SerializedName("total") 
    private String mTotalCount; 

    @SerializedName("page") 
    private int mPage; 

    @SerializedName("sort") 
    private String mSort; 

    @SerializedName("new") 
    private boolean mNew; 

    public List<Integer> getIds() { 
     return mIds; 
    } 

    public String getDigest() { 
     return mDigest; 
    } 

    public String getTotalCount() { 
     return mTotalCount; 
    } 

    public int getpage() { 
     return mPage; 
    } 

    private String buildRequest() { 
     String out = "total=" + mTotalCount + "&"; 
     out += "sort=" + mSort + "&"; 
     out += "page=" + mPage + "&"; 
     out += "new=" + mNew + "&"; 
     for (int i = 0; i < mIds.size(); i++) { 
      out += "ids[]=" + mIds.get(i) + "&"; 
     } 
     out += "hexdigest=" + mDigest + "&"; 
     return out; 
    } 
} 

private static class Company { 

    private String mLink; 
    private String mName; 
    private String mDescription; 

    public Company(String name, String link, String description) { 
     mLink = link; 
     mName = name; 
     mDescription = description; 
    } 

    public String getLink() { 
     return mLink; 
    } 

    public String getName() { 
     return mName; 
    } 

    public String getDescription() { 
     return mDescription; 
    } 
} 

private static class HtmlContainer { 

    @SerializedName("html") 
    private String mHtml; 

    public String getHtml() { 
     return mHtml; 
    } 
} 

完全なコードは、これは私が探していたものだけだったhere

+0

も可能です。 あなたは命を救っています。ありがとうございます<3 – vidhi

+1

もう1つ問題があります。 行: 会社(data.get(i).select( "a")。first()。attr( "title")を置き換えます( "\\\" "、" ")、 Doesn '会社の完全なタイトルを与える;それに2つの単語がある場合、例えば「Abd Motors」と言うと、あなたは「Abd」を取得するだけです@Bertrand – vidhi

+0

@vidhi ok私は答えを更新しました。 GET https://angel.co/companies/startupsはJSONデータを提供していましたが、Jsoupで解析する予定ですが、 'ignoreContentType'を指定するとjson内のエスケープされた引用符が正しく解析されないので、少し難解です。 Gsonでオブジェクトを解析して上記を更新し、htmlを抽出すると、それらのすべての醜い 'replac e(" \\\ ""、 "") –

関連する問題