Неверный URL-адрес JSOUP при чтении из файла CSV с использованием openCSV

У меня проблема с использованием JSoup, поскольку он дает мне неверный URL-адрес. Если я жестко запрограммирую URL-адрес в программе, она будет работать нормально, но если я прочитаю CSV-файл в List‹String[]›, а затем зациклю каждое из значений в списке, произойдет сбой. Например, если я жестко запрограммирую http://www.clubmark.org.uk/ в программе, работает нормально, но если я прочитаю его из csv в List‹String[]›, произойдет сбой.

Трассировка стека

Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.IllegalArgumentException: Malformed URL: http://www.clubmark.org.uk/
    at org.jsoup.helper.HttpConnection.url(HttpConnection.java:131)
    at org.jsoup.helper.HttpConnection.connect(HttpConnection.java:70)
    at org.jsoup.Jsoup.connect(Jsoup.java:73)
    at com.domainModel.DownloadImages.findImages(DownloadImages.java:43)
    at com.workingprojects.WebScraperApplication.main(WebScraperApplication.java:40)

Мой основной класс

@SpringBootApplication
@EntityScan({"com.bootstrap","com.domainModel"})
@ComponentScan({"com.bootstrap","com.domainModel"})
public class WebScraperApplication {

    public static void main(String[] args) throws IOException, CsvException {
        SpringApplication.run(WebScraperApplication.class, args);
        
        DownloadImages downloadImages = new DownloadImages();


        
        ReadCSV readCSV = new ReadCSV();
        ArrayList<String[]> urls = (ArrayList<String[]>) readCSV.csvReader("C:\\link1.csv");
    

        for (int i = 0; i < 1; i++) {     
            String[] thisURLObject = urls.get(0);
            String thisURL =thisURLObject[0];
            String status = downloadImages.findImages(thisURL, "C:\\Users\\xxx\\images");
            System.out.println(thisURL + status);
            
            
            }
        
        
;
        System.out.println("finished");
        
    }

}

Мой класс, который получает изображения и где видна проблема,

package com.domainModel;


import org.jsoup.Jsoup;






public class DownloadImages {
    
    
    
     //The url of the website.
    @Getter @Setter
    private String webSiteURL;



//The path of the folder that you want to save the images to
@Getter @Setter
private  String folderPath;
 
public String findImages(String webSiteURL, String folderPath ) {
 
    try {
 
        //Connect to the website and get the html
        Document doc = Jsoup.connect(webSiteURL).get();
        
 
        //Get all elements with img tag ,
        Elements img = doc.getElementsByTag("img");
       System.out.println("Images is" + img.size());
       
 
       String folderNameWk2 = webSiteURL.replace(".html", "");
       String folderNameWk3 = folderNameWk2.replace("http://", "");
     
       Path path = Paths.get(folderPath + folderNameWk3);
       Files.createDirectories(path);
       String path1 = path.toString();
       System.out.println("The path is " + path1);
       
       
       int counter = 0;
 
        for (Element el : img) {
            
            
            
            String docName = String.valueOf(counter)+".jpeg";
 
            //for each element get the srs url
            String src = el.absUrl("src");
 
            System.out.println("Image Found!");
            System.out.println("src attribute is : "+src);
            getImages(src, path1, docName);
     
            counter = counter+1;
 
        }
 
    } catch (IOException ex) {
        
        System.err.println("There was an error");
        System.out.println(ex);
    //    Logger.getLogger(DownloadImages.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    return "complete";
}



    private void getImages(String src, String folderPath, String docName) throws IOException {
 
     //   String folder = null;
 
        //Exctract the name of the image from the src attribute
        int indexname = src.lastIndexOf("/");
 
        if (indexname == src.length()) {
            src = src.substring(1, indexname);
        }
 
        indexname = src.lastIndexOf("/");
        String name = src.substring(indexname, src.length());
 
        System.out.println(name);
 
        //Open a URL Stream
        URL url = new URL(src);
        InputStream in = url.openStream();
 
        OutputStream out = new BufferedOutputStream(new FileOutputStream(folderPath+"/" + docName));
 
        for (int b; (b = in.read()) != -1;) {
            out.write(b);
        }
        out.close();
        in.close();
 
    }

    /**
     * @param webSiteURL
     * @param folderPath
     */
    public DownloadImages(String webSiteURL, String folderPath) {
        super();
        this.webSiteURL = webSiteURL;
        this.folderPath = folderPath;
    }

    /**
     * 
     */
    public DownloadImages() {
        super();
    }
    
    
}


And the class which gets the CSV file is 

    package com.domainModel;



public class ReadCSV {
    

    
    public List<String[]> csvReader(String fileName) throws IOException, CsvException{

           
        try (CSVReader reader = new CSVReader(new FileReader(fileName))) {
            List<String[]> r = reader.readAll();
     
            
            return r;
            

    
}
}
}

Мой класс, который читает в CSV

public class ReadCSV {
    

    
    public List<String[]> csvReader(String fileName) throws IOException, CsvException{

           
        try (CSVReader reader = new CSVReader(new FileReader(fileName))) {
            List<String[]> r = reader.readAll();
     
            
            return r;
            

    
}
}
}

Я достаточно уверен, что проблема связана с форматом того, что я передаю из списка, но когда я смотрю на значения, они, безусловно, кажутся строками.

Первые две строки CSV-файла

http://www.clubmark.org.uk/, http://www.designit-uk.com/,

Изображение первых двух строк данных в блокноте

изображение первых двух строк CSV


person HuddersfieldLad    schedule 05.01.2021    source источник
comment
Это много кода. Любой шанс, что вы могли бы отредактировать вопрос и привести код к минимально воспроизводимый пример?   -  person Robert    schedule 05.01.2021
comment
Также потребуются некоторые данные CSV, чтобы убедиться, что у вас действительно есть минимальный воспроизводимый пример.   -  person andrewjames    schedule 05.01.2021
comment
Спасибо за вашу помощь. Я удалил импорт из кода и некоторые комментарии. Добавлено изображение файла csv и первые 2 строки данных   -  person HuddersfieldLad    schedule 05.01.2021
comment
Спасибо за обновления. Ваш код отлично работает для меня - он не выдает исключение с неверным URL-адресом. JSoup правильно загружает веб-страницу для URL-адреса клубной марки. Итак, это означает, что у меня все еще нет воспроизводимой части минимально воспроизводимого примера.   -  person andrewjames    schedule 05.01.2021
comment
Кроме того, я заметил, что вы используете Блокнот со своим текстовым файлом. Я рекомендую вам не использовать Блокнот, потому что он вставляет скрытые метки порядка следования байтов в начале строки. файл. Я не думаю, что это является причиной вашей конкретной проблемы, но я бы все же рекомендовал Notepad++ или другой текстовый редактор.   -  person andrewjames    schedule 05.01.2021
comment
@andrewjames Я думаю, что проблема возникает только при считывании данных из CSV-файла. Он отлично работает, когда я просто жестко ввожу URL-адрес. Я думаю, что единственный способ воссоздать его — загрузить файл csv в программу. Я не знаю, как загрузить копию CSV-файла на этот сайт, но это простой CSV-файл с 1 столбцом, содержащим несколько URL-адресов. Примечание. Я создал csv с помощью Excel (сомневаюсь, что это актуально, но может быть). Спасибо за совет по блокноту   -  person HuddersfieldLad    schedule 05.01.2021
comment
Ах, в качестве теста попробуйте создать обычный текстовый файл с помощью Notepad++ (что я и сделал, и ваш код сработал). Не используйте Excel для создания CSV-файла. Посмотрите, работает ли это. Excel (как Блокнот и другие инструменты MS) имеет тенденцию также добавлять спецификации в начало файла, так что, возможно, это мешает парсеру URL.   -  person andrewjames    schedule 05.01.2021
comment
Затем, если это поможет, взгляните на это или посмотрите, можно ли использовать OpenCSV настроен на обработку (т. е. игнорирование) спецификаций.   -  person andrewjames    schedule 05.01.2021
comment
спасибо @andrewjames james, это был персонаж BOM. Для интереса, если у кого-то снова возникнет проблема, откройте CSV в notepad++ и посмотрите в правый нижний угол. Если он говорит UTF-8-BOM, то файл содержит символ BOM. Чтобы удалить символ спецификации, перейдите в раздел «Кодировка» и выберите «Преобразовать в UTF-8». Сохраните файл и повторите попытку импорта.   -  person HuddersfieldLad    schedule 05.01.2021
comment
Рад, что это решилось. Вы можете преобразовать примечания в своем последнем комментарии в ответ. Вы даже можете пометить ответ как принятый, если хотите.   -  person andrewjames    schedule 06.01.2021