-2

我试图从 html 中获取一些数据。这是我的代码:

 public static void main(String[] args) {
        final String str = "<div class=\"b-vacancy-list-salary\">\n" +
                "            from 50 000\n" +
                "             to 70 000\n" +
                "             USD.\n" +
                "        </div>";
        System.out.println(Arrays.toString(getTagValues(str).toArray()));
    }


    static final String tag = "<div class=\"b-vacancy-list-salary\">\n";
    private static final Pattern TAG_REGEX = Pattern.compile(tag+"(.+?)</div>");

    private static List<String> getTagValues(final String str) {
        System.out.println(tag);
        final List<String> tagValues = new ArrayList<String>();
        final Matcher matcher = TAG_REGEX.matcher(str);
        while (matcher.find()) {
            tagValues.add(matcher.group(1));
        }
        return tagValues;
    }

它返回[],但不返回值。怎么了?

4

5 回答 5

1

您可以删除line feed.

解析 HTML 的更好方法是使用 DOM 解析器或 Xpath。

例如:

    public static void main(String[] args) {
      final String str = "<div class=\"b-vacancy-list-salary\">\n"
              + "            from 50 000\n"
              + "             to 70 000\n"
              + "             USD.\n"
              + "        </div>";
      System.out.println(Arrays.toString(getTagValues(str).toArray()));
    }
    static final String tag = "<div class=\"b-vacancy-list-salary\">";
    private static final Pattern TAG_REGEX = Pattern.compile(tag + "(.+?)</div>");

    private static List<String> getTagValues(final String str) {
      System.out.println(tag);
      final List<String> tagValues = new ArrayList<String>();
      final Matcher matcher = TAG_REGEX.matcher(str.replace("\n", ""));
      while (matcher.find()) {
        tagValues.add(matcher.group(1).trim());
      }
      return tagValues;
    }
于 2013-08-23T15:55:12.160 回答
1

代替

private static final Pattern TAG_REGEX = Pattern.compile(tag+"(.+?)</div>");

利用

private static final Pattern TAG_REGEX = Pattern.compile(tag+"([\\s|\\S]+?)</div>");
于 2013-08-23T16:02:03.450 回答
0

尝试添加Pattern.DOTALL作为 的第二个参数Pattern.compile。这使模式中的点能够匹配换行符。不确定这是否能完全满足您的需求,但它可能会帮助您入门。

private static final Pattern TAG_REGEX = Pattern.compile(tag + "(.+?)</div>",
                                                         Pattern.DOTALL);

DOTALL 上的 Javadoc 在这里

于 2013-08-23T16:06:52.347 回答
0

.*不包括新行。尝试这个:

Pattern.compile(tag + "((.|\n)*)</div>");
于 2013-08-23T16:07:40.713 回答
0

您需要制作“。” 匹配换行符,你可以通过在你的正则表达式前面加上“(?s)”来做到这一点;所以在你的情况下,做 Pattern.compile("(?s)" + tag + "(.+?)");

于 2013-08-23T16:10:24.630 回答