【问题标题】:How to get h2 Tag of a table using Jsoup如何使用 Jsoup 获取表的 h2 标签
【发布时间】:2012-12-21 16:10:23
【问题描述】:

我需要一些帮助来使用 Jsoup 抓取网页。我想从 hcfactions 网页解析玩家资料并收集他们的杀戮和死亡情况。我遇到的问题是每个个人资料页面都是动态创建的,并且只有在玩家被杀或死亡时才会有所述表格。因此,为了知道我正在解析哪个表,我需要获取调用后设置的标题文本。

示例网页:http://www.hcfactions.net/index.php?action=playerinfo&player=Djmaddox.

下面是我正在抓取的网页的 html 片段:

<table class='table-bordered'><h2 style='text-align:center'>Deaths</h2>
    <tr><td>Date</td><td>Reason</td><td>Details</td></tr><tr><td>Dec 11 5:27pm CST</td>.....

我有这段代码可以拉出表格并计算条目,但它不会拉出 h2 标签供我选择。

public void getPlayerDetails(String name) {
        String data = "";
        Avatar temp = _db.getPlayer(name);
        playerUrl = "http://www.hcfactions.net/index.php?action=playersearch&player=" + name;
        try {
//            data = Jsoup.connect(url)
//                    .url(url).get().html();
            playerDoc = Jsoup.connect(playerUrl).get();
        } catch (IOException ex) {
            Logger.getLogger(JParser.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (playerDoc.select("table").size() == 1) {
            return;
        } else if (playerDoc.select("table").size() >= 2) {

            for (int x = 1; x < playerDoc.select("table").size(); x++) {

                System.out.println("deaths");
                Element table = playerDoc.select("table").get(x);
                Iterator<Element> ite = table.select("tr").iterator();
                int count = 0;
                while (ite.hasNext()) {
                    data = ite.next().text();
                    count++;
                }

                if (count > 0) {
                    temp.setDeaths(count - 1);
                }


            }

        }
    }

【问题讨论】:

    标签: java html screen-scraping jsoup


    【解决方案1】:

    标签&lt;h2&gt; 位于无效位置。这就是我认为 JSoup 找不到它的原因。您必须使用正则表达式自己提取它。可以通过以下代码获取&lt;h2&gt;的内容:

    String tableToString = "<table class='table-bordered'><h2 style='text-align:center'>Deaths</h2>" + "<tr>" + "<td>Date</td>" + "<td>Reason</td>" + "<td>Details</td>" + "</tr>" + "</table>";
    String regex = "<h2.*>(.*)?</h2>";
    
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(tableToString);
    if (matcher.find()) {
        System.out.println(matcher.group(1));
    }
    

    您可以在您的代码中使用table.toString() 初始化tableToString

    【讨论】:

      【解决方案2】:

      正如 ka3ak 所说,&lt;h2&gt; 定位错误。但是您不必为此放弃解析器而求助于正则表达式。假设 JSoup 是一个不错的 HTML 解析器(我自己从未使用过),&lt;h2&gt; 元素应该是紧接在 &lt;table&gt; 元素之前的元素。让你的“选择”语句在那里寻找它。

      【讨论】:

        【解决方案3】:

        Elements headers=playerDoc.select("div.span10.offset1 h2");
        恕我直言,您的选择接缝有点过于复杂,但也许必须是这样。无论如何,上面的 sn-p 将使您获得正确容器中存在的每个 H2 标签。 稍后您可以选择像
        Elements tables=playerDoc.select("div.span10.offset1 table");
        这样的所需表,并应用适当的数据挖掘它们。标题将与表的顺序相对应。我想,我的工作已经在这里完成了:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-26
          相关资源
          最近更新 更多