【问题标题】:how to scrape data from one table having same class in other table如何从另一个表中具有相同类的一个表中抓取数据
【发布时间】:2016-05-06 11:35:11
【问题描述】:

我必须从有许多表格的网站上抓取数据并将其保存在 .csv 文件中。我只抓取一个具有市场数据类的表的数据。但是,还有两个其他表具有相同的类。目前我的代码正在从具有市场数据类的表中获取所有数据。如何从一个表中抓取数据并跳过其他表? 我的代码如下。

public class ComMarket_summary {

boolean writeCSVToConsole = true;
boolean writeCSVToFile = true;
boolean sortTheList = true;
boolean writeToConsole;
boolean writeToFile;
public static Document doc = null;
public static Elements tbodyElements = null;
public static Elements elements = null;
public static Elements tdElements = null;
public static Elements trElement2 = null;
public static String Dcomma = ",";
public static String line = "";
public static ArrayList<Elements> sampleList = new ArrayList<Elements>();

public static void createConnection() throws IOException {
    System.setProperty("http.proxyHost", "191.1.1.202");
    System.setProperty("http.proxyPort", "8080");
    String tempUrl = "http://www.psx.com.pk/phps/mktSummary.php";
    doc = Jsoup.parse(new URL(tempUrl), 1000);        
    System.out.println("Successfully Connected");
}

public static void parsingHTML() throws Exception {

    for (Element table : doc.getElementsByTag("table")) {
        for (Element trElement : table.getElementsByTag("tr")) {
            File fold = new File("C:\\market_smry.csv");
            fold.delete();
            File fnew = new File("C:\\market_smry.csv");
            trElement2 = trElement.getElementsByTag("tr");
            tdElements = trElement.getElementsByTag("td");
            FileWriter sb = new FileWriter(fnew, true);

            if (table.hasClass("marketData")) {

                for (Iterator<Element> it = trElement2.iterator(); it.hasNext();) {
                    if (it.hasNext()) {
                        sb.append("\r\n");

                    }

                    for (Iterator<Element> it2 = trElement2.iterator(); it.hasNext();) {
                        Element tdElement2 = it.next();
                        final String content = tdElement2.text();
                        if (it2.hasNext()) {

                            sb.append(formatData(content));
                            sb.append("   ,   ");

                        }

                    }

                    System.out.println(sb.toString());
                    sb.flush();
                    sb.close();
                }
            }
            System.out.println(sampleList.add(tdElements));

        }
    }
}
private static final SimpleDateFormat FORMATTER_MMM_d_yyyy = new SimpleDateFormat("MMM d, yyyy", Locale.US);
private static final SimpleDateFormat FORMATTER_dd_MMM_yyyy = new SimpleDateFormat("dd-MMM-YYYY", Locale.US);

public static String formatData(String text) {
    String tmp = null;

    try {
        Date d = FORMATTER_MMM_d_yyyy.parse(text);
        tmp = FORMATTER_dd_MMM_yyyy.format(d);
    } catch (ParseException pe) {
        tmp = text;
    }

    return tmp;
}

public static void main(String[] args) throws IOException, Exception {
    createConnection();
    parsingHTML();

}

P.S:我使用的是 JDK 1.8、Jre 1.8、jsoup 1.8。

【问题讨论】:

  • 只选择你想要的表类:element.select("tr[class=tableClass]");
  • 粘贴完整的 html dom?你可能错过了什么

标签: java web-scraping web-crawler jsoup


【解决方案1】:

您可以使用更具体的选择器来优化您的代码。

for (Element table : doc.select("table.marketData")) {
//Process table
}

如果您只想处理页面上的特定表格,您可以通过其索引访问该表格。

Elements tables = doc.select("table.marketData");
Element table = tables.get(1);

【讨论】:

  • simGel 实际上我已经跳过了两个具有 marketSummary 类的表并检索所有其他表。你的命令没有在 if 语句中运行。
【解决方案2】:

看到如何有 3 个具有“marketData”类的表,您将需要找到您想要的表的一些其他识别特征(您想要的表是否有 id?,标题列是否不同?等) .不过,如果没有看到 html,我无法提供更多指导。

【讨论】:

  • 可以看到网站的链接打开网站按ctrl+shift+i可以看到html标签。我想要汽车装配商标签后的所有数据。
【解决方案3】:

假设您要从第一个表中提取数据。
你可以使用这个 CSS 选择器:table.marketData:nth-of-type(1)

然后你的代码变成:

for (Element table : doc.getElementsByTag("table.marketData:nth-of-type(1)")) {
    for (Element trElement : table.getElementsByTag("tr")) {
        File fold = new File("C:\\market_smry.csv");
        fold.delete();
        File fnew = new File("C:\\market_smry.csv");
        trElement2 = trElement.getElementsByTag("tr");
        tdElements = trElement.getElementsByTag("td");
        FileWriter sb = new FileWriter(fnew, true);

        // /////////
        // You can safely remove the if block below.  
        // Jsoup has already performed the filtering for you.
        // /////////
        //if (table.hasClass("marketData")) {

            for (Iterator<Element> it = trElement2.iterator(); it.hasNext();) {
                if (it.hasNext()) {
                    sb.append("\r\n");

                }

                for (Iterator<Element> it2 = trElement2.iterator(); it.hasNext();) {
                    Element tdElement2 = it.next();
                    final String content = tdElement2.text();
                    if (it2.hasNext()) {

                        sb.append(formatData(content));
                        sb.append("   ,   ");

                    }

                }

                System.out.println(sb.toString());
                sb.flush();
                sb.close();
            }
        //}
        System.out.println(sampleList.add(tdElements));
    }
}

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-06-08
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多