Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jsoup java html解析_Java_Html_Apache Poi_Jsoup - Fatal编程技术网

jsoup java html解析

jsoup java html解析,java,html,apache-poi,jsoup,Java,Html,Apache Poi,Jsoup,我是stack上的一个新的法国用户,我有一个问题^^ 我使用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.

我是stack上的一个新的法国用户,我有一个问题^^

我使用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();
        }

    }
}
主类(入口点)

包测试2;
导入java.util.ArrayList;
公共班机{
公共静态void main(字符串[]args)
{
ArrayList URL=新的ArrayList();
URL.add(“http://base-donnees-publique.medicaments.gouv.fr/affichageDoc.php?specid=61266250&typedoc=R");
URL.add(“http://base-donnees-publique.medicaments.gouv.fr/affichageDoc.php?specid=66207341&typedoc=R");
for(字符串url:url)
{
新任务(url).run();
}
}
}
当数据被复制到我的excel文件时,第二个url不起作用

你能帮我解决我的问题吗


谢谢

我想这是因为您的
main()
在第二个线程有机会完成它的工作之前退出。您应该使用
Thread.join()
等待所有生成的线程完成。或者更好的方法是,创建一个
ExecutorService
,并使用
等待终止(…)
进行阻止,直到解析所有URL。

编辑查看这里的一些示例

这两个空格在你的主类第一个链接中是正常的吗?“base donnees-publique.medicaments.gouv.fr”是的,为什么url中有空格?我复制粘贴时只是个错误对不起,但是我需要解析13000 url:/:我还有一个问题,我使用.class属性获取信息,但是在文档中,对于不同的数据,我们有相同的.class,问题是当我想收集所有日期时,他只记录了最后一个日期:我希望你能理解,因为我的英语很差:/你有什么理由1)不同时运行这些线程(你的问题表明你正在尝试并行运行线程)2)覆盖文件?另外,请添加更多详细信息,说明您正在尝试做什么,以及您的程序执行什么操作。对于我需要获取网页信息的工作,请转到此链接,在选择药物后选择一个字母,然后到达带有3个选项卡的页面,我需要获取第二个选项卡的信息,并将所有数据复制到xls文件中,但我需要对所有药物都这样做:问题是:如何在所有页面上都这样做(我有13000页?第二个pb是当我想用html文档中的attr类获取信息时,我有相同的atribu,但当我获取这个atribut jsoup只获取最后一个atr时,atr是.ammCorpTextExt肯定不是。线程甚至不并发运行。(
run()
而不是
start()
)。让我们补充一点:即使它们是并发执行的,只要有非守护进程线程在运行,jvm就不会退出。但是并发运行它们是不健康的,因为它们会写入同一个文件。你有一个例子吗
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();
        }

    }

}