Пытаюсь построить скребок на java для удовольствия. Мне кажется, что я разложил большую часть жесткого кода, мне просто нужно организовать его сейчас. Мне нужно как-то вычесть "[" "]" и запятую в начале каждой строки. Я считаю, что мы работаем с функцией parse_source_code, но могу ошибаться. Помощь будет принята с благодарностью.

Мой код:

import java.util.ArrayList;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

public class Scraper {
    public static void main(String [] args)throws Exception{

        String webURL = "https://statsroyale.com/clan/99VUU8Y";
        write_data(parse_source_code(get_url_source(webURL)));
}

    public static List<String> get_url_source(String URL)throws Exception {

        List <String> source = new ArrayList <>();

        URL webLink = new URL(URL);

        HttpsURLConnection statsConnection = (HttpsURLConnection) webLink.openConnection();
        statsConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
        statsConnection.connect();

        BufferedReader in = new BufferedReader(new InputStreamReader(statsConnection.getInputStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null)
            source.add(inputLine);
            in.close();

        return source;
  }
    public static List<String> parse_source_code(List<String> source_code) {

        List <String> data = new ArrayList <>();

        List <String> rank = new ArrayList <>();
        List <String> name = new ArrayList <>();
        List <String> level = new ArrayList <>();
        List <String> league = new ArrayList <>();  
        List <String> trophies = new ArrayList <>();
        List <String> donations = new ArrayList <>();
        List <String> role = new ArrayList <>();

        for (int i = 0; i < source_code.size(); i++) {
            if (source_code.get(i).contains("<div class=\"clan__rowContainer\">")) {
                String Prank = source_code.get(i + 2).split("                            ")[1];
                rank.add(Prank);
            }
            if (source_code.get(i).contains("/profile/")) { 
            String PName = source_code.get(i).split("'>")[1].split("</a")[0];
            name.add(PName);
            }
            if (source_code.get(i).contains("clan__playerLevel\">")) {  
                String Plevel = source_code.get(i).split("Level\">")[1].split("</span")[0];
                level.add(Plevel);
            }
            if (source_code.get(i).contains("<div class=\"league__")) { 
                String Pleague = source_code.get(i).split("\"league__")[1].split("\"></div>")[0];
                league.add(Pleague);
            }
            if (source_code.get(i).contains("class=\"clan__cup\">")) {  
                String Ptrophies = source_code.get(i).split("cup\">")[1].split("</div>")[0];
                trophies.add(Ptrophies);
            }
            if (source_code.get(i).contains("<div class=\"clan__cup\">")) { 
                String Pdonations = source_code.get(i + 2).split("row\">")[1].split("</div>")[0];
                donations.add(Pdonations);
            }
            if (source_code.get(i).contains("<div class=\"clan__cup\">")) { 
                String Prole = source_code.get(i + 4).split("             ")[1];
                role.add(Prole);
            }
        }
        for(int i = 0; i < rank.size(); i++) {
            data.add(rank.get(i));
            data.add(name.get(i));
            data.add(level.get(i));
            data.add(league.get(i));
            data.add(trophies.get(i));
            data.add(donations.get(i));     
            data.add(role.get(i) + "\n");
        }
        System.out.println(data);
        return data;
    }       
    public static void write_data(List <String> data)throws IOException {

        File csv = new File("CR CSV.TXT");

            PrintWriter output = new PrintWriter (csv);
            output.println(data);
            output.close();

    }
}   

Снова извините, если он неправильно расставлен. Все еще пытаюсь это изучить. (Не так просто, как кажется)

1
user8306096 1 Авг 2017 в 23:08
1
Есть какая-то ошибка, с которой вам нужна помощь?
 – 
Rabbit Guy
1 Авг 2017 в 23:10
Нет, работает нормально. Но мне просто нужно вычесть запятую в начале каждой строки, а затем скобки в начале и в конце
 – 
user8306096
1 Авг 2017 в 23:12
Что вы ожидаете от него напечатать?
 – 
Rabbit Guy
1 Авг 2017 в 23:12
Все, что есть в данных
 – 
user8306096
1 Авг 2017 в 23:13
Когда вы делаете эту строку там, где вы ожидаете, что она будет печатать данные, она просто печатает ссылку на этот массив. Вам нужно написать метод, который распечатывает массив
 – 
Rabbit Guy
1 Авг 2017 в 23:13

3 ответа

Есть способы сделать это лучше, но с тем, что у вас есть, это сработает:

Замените output.println (data) на:

for(String token: data) {
            output.print(token);
            if(token.indexOf("\n") == -1) {
                output.print(", ");
            }
}

[] И запятые идут от toString данных ArrayList, вы должны печатать каждый элемент так, как вы хотите, а не позволять toString делать это за вас.

В моем примере используется наличие символа eol для завершения строки, было бы лучше сохранить его в классе с чистым методом toString.

0
Steve Bauer 1 Авг 2017 в 23:26

Если эти элементы сочетаются, я думаю, что это плохой дизайн:

    List <String> data = new ArrayList <>();

    List <String> rank = new ArrayList <>();
    List <String> name = new ArrayList <>();
    List <String> level = new ArrayList <>();
    List <String> league = new ArrayList <>();  
    List <String> trophies = new ArrayList <>();
    List <String> donations = new ArrayList <>();
    List <String> role = new ArrayList <>();

Лучше было бы инкапсулировать все те вещи, которые идут вместе, в один объект и иметь единый список этого класса.

0
duffymo 1 Авг 2017 в 23:15

Вероятно, вам следует использовать стороннюю библиотеку, такую ​​как JSoup, чтобы помочь с синтаксическим анализом HTML, но если вы хотите сделать свой собственный синтаксический анализ и

вычтите "[" "]" и запятую в начале каждой строки

Где каждая «строка» представляет собой String, я бы рекомендовал использовать методы Java String.charAt(), String.substring() или даже String.replaceFirst().

Код будет выглядеть примерно так

if(line.charAt(0) == '[') { line = line.substring(1); } if(line.charAt(0) == ']') { line = line.substring(1); } if(line.charAt(0) == ',') { line = line.substring(1); }

Или даже

line = line.replaceFirst("[],");

0
Ryan D'souza 1 Авг 2017 в 23:22