jsoup java html解析
我是stack上的一个新的法国用户,我有一个问题^^ 我使用HTML解析Jsoup来解析HTML页面。这没关系,但我不能同时解析更多的url 这是我的代码: 用于解析网页的第一个类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.
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();
}
}
}