我正在尝试在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();
}
}
如果间隔错误再次对不起。仍在努力学习它。 (并不像看起来那么容易)
答案 0 :(得分:0)
如果这些项目合在一起,我认为这是一个糟糕的设计:
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 <>();
更好的方法是将所有那些组合在一起的东西封装成一个对象并拥有该类的单个列表。
答案 1 :(得分:0)
你应该使用像JSoup这样的第三方库来帮助解析HTML,但是如果你想自己进行解析并且
减去&#34; [&#34; &#34;]&#34;和每行开头的逗号
每个&#34;行&#34;是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("[],");
答案 2 :(得分:0)
有更好的方法可以做到这一点,但有了你的工作,这将有效:
将output.println(data)替换为:
for(String token: data) {
output.print(token);
if(token.indexOf("\n") == -1) {
output.print(", ");
}
}
[]和逗号来自ArrayList数据的toString,你必须按照你想要的方式打印每个元素,而不是让toString为你做。
我的例子是使用eol字符的存在来终止该行,最好将它存储在带有干净的toString方法的Class中。