java - jsoup java html解析

标签 java html apache-poi jsoup

我是堆栈上的新法国用户,我遇到了问题 ^^

我使用 HTML 解析 Jsoup 来解析 html 页面。为此没关系,但我无法同时解析更多 url。

这是我的代码:

解析网页的第一类

package test2;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public final class Utils {

    public static Map<String, String> parse(String url){

        Map<String, String> out = new HashMap<String, String>();

        try
        {
            Document doc = Jsoup.connect(url).get();

            doc.select("img").remove();

            Elements denomination = doc.select(".AmmDenomination");
            Elements composition = doc.select(".AmmComposition");
            Elements corptexte = doc.select(".AmmCorpTexte");


            for(int i = 0; i < denomination.size(); i++)
            {
                out.put("denomination" + i, denomination.get(i).text());
            }

            for(int i = 0; i < composition.size(); i++)
            {
                out.put("composition" + i, composition.get(i).text());
            }

            for(int i = 0; i < corptexte.size(); i++)
            {
                out.put("corptexte" + i, corptexte.get(i).text());
                System.out.println(corptexte.get(i));
            }

        } catch(IOException e){
            e.printStackTrace();
        }
        return out;
    }//Fin Methode parse


    public static void excelizer(int fileId, Map<String, String> values){

        try
        {
            FileOutputStream out = new FileOutputStream("C:/Documents and Settings/c.bon/git/clinsearch/drugs/src/main/resources/META-INF/test/fichier2.xls" );
            Workbook wb = new HSSFWorkbook();
            Sheet mySheet = wb.createSheet();
            Row row1 = mySheet.createRow(0);
            Row row2 = mySheet.createRow(1);

            String entete[] = {"CIS", "Denomination", "Composition", "Form pharma", "Indication therapeutiques", "Posologie", "Contre indication", "Mise en garde",
                    "Interraction", "Effet indesirable", "Surdosage", "Pharmacodinamie", "Liste excipients", "Incompatibilité", "Duree conservation",   
                    "Conservation", "Emballage", "Utilisation Manipulation", "TitulaireAMM"};

            for (int i = 0; i < entete.length; i++)
            {
                row1.createCell(i).setCellValue(entete[i]);
            }


            Set<String> set = values.keySet();
            int rowIndexDenom = 1;
            int rowIndexCompo = 1;

            for(String key : set)
            {
                if(key.contains("denomination"))
                {
                    mySheet.createRow(1).createCell(1).setCellValue(values.get(key));
                    rowIndexDenom++;
                }
                else if(key.contains("composition"))
                {
                    row2.createCell(2).setCellValue(values.get(key));
                    rowIndexDenom++;
                }
            }
            wb.write(out);
            out.close();
        }   
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
}

二等舱

package test2;

public final class Task extends Thread {

    private static int fileId = 0;
    private int id;
    private String url;


    public Task(String url)
    {
        this.url = url;
        id = fileId;
        fileId++;
    }

    @Override
    public void run()
    {
        Utils.excelizer(id, Utils.parse(url));
    }
}

主类(入口点)

package test2;
import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
        ArrayList<String> urls = new ArrayList<String>();
        urls.add("http://base-donnees-publique.medicaments.gouv.fr/affichageDoc.php?specid=61266250&typedoc=R");
        urls.add("http://base-donnees-publique.medicaments.gouv.fr/affichageDoc.php?specid=66207341&typedoc=R");

        for(String url : urls)
        {
            new Task(url).run();
        }

    }

}

当数据被复制到我的 excel 文件时,第二个 url 不起作用。

你能帮我解决我的问题吗?

谢谢

最佳答案

我认为这是因为你的 main() 在你的第二个线程有机会完成它的工作之前就退出了。您应该使用 Thread.join() 等待所有生成的线程完成。或者更好的是,创建一个 ExecutorService 并使用 awaitTermination(...) 进行阻塞,直到所有 URL 都被解析。
编辑 在这里查看一些例子http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html

关于java - jsoup java html解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29168580/

相关文章:

java - 如何使用servlet获取glassfish根目录的真实路径

java - Google 目录 API setPassword() Java

excel - 打开由 Java POI 创建的 Excel 工作表时出现错误消息

java - 如何使用 Apache POI 从 PDF 中提取原始文本?

java - Msort 错误,通用

java - 这个 for 循环定义了一个条件,但后来忽略了它

html - 使用 HTML 表单时如何在 HTTP 请求正文中发送数据?

html将frameset和frame转成div

javascript - 当我单击操作下拉菜单时,选项显示在滚动条中,为什么?

java - 生成 Excel 标题时更改特定文本的颜色