0

我希望从包含特定日期的某些 HTML 中提取特定的 HTML 标记。

在单元测试中提供给它的 HTML 是:

这是有问题的单元测试:

public void testParseBasePage(){
    defenseGovContractsParser a = new defenseGovContractsParser("060613");
    String expected = "http://www.defense.gov/contracts/contract.aspx?contractid=5059";
    String result = a.parseBasePage("<td><a id=\"ctl00_ContentPlaceHolder_Body_ContractSummary_dgPRItems_ctl02_lnkPressItem\" title=\"Click for Contracts for June 06, 2013\" class=\"Link12\" href=\"http://www.defense.gov/contracts/contract.aspx?contractid=5059\">Contracts for June 06, 2013</a><span id=\"ctl00_ContentPlaceHolder_Body_ContractSummary_dgPRItems_ctl02_lblSubTitle\" class=\"MoreNews3a\"></span></td>");
    assertEquals(expected,result);
}

这是有问题的代码:

public String parseBasePage(String HTML) {
    String contractUrl;
    String yr = date.substring(4, 6);
    String day = date.substring(2, 4);
    String month = getMonthForInt(Integer.parseInt(date.substring(0, 2)));
    Pattern getLink = Pattern.compile("<a.*?" + month + ".*?" + day + ".*?20" + yr + ".*?>");
    Matcher match = getLink.matcher(HTML);
    String link = match.group();
    contractUrl = link.substring(link.indexOf("href") + 6);
    contractUrl = contractUrl.replaceFirst("\">", "");
    return contractUrl;
}

private String getMonthForInt(int m) {
    String month = "invalid";
    m = m - 1;
    DateFormatSymbols dfs = new DateFormatSymbols();
    String[] months = dfs.getMonths();
    if (m >= 0 && m <= 11) {
        month = months[m];
    }
    return month;
}

生成的正则表达式是:

<a.*?June.*?06.*?2013.*?>

当我使用任何在线正则表达式测试器时,它会按预期匹配

4

1 回答 1

4

真的会推荐一个不错的 HTML 解析器,例如JSoupJTidy(在这种情况下可能会令人困惑地命名),而不是为此目的使用 regepxs。

除了最简单的情况,正则表达式在 HTML 上不起作用,而一个体面的 HTML 解析器将是一个更可靠的解决方案。

于 2013-06-07T16:03:18.057 回答