使用Java从html中提取锚标记

Ebb*_*ham 0 java html-parsing

我在文本中有几个锚标签,

输入: <a href="http://stackoverflow.com" >Take me to StackOverflow</a>

输出: http://stackoverflow.com

如何在不使用第三方API的情况下找到所有这些输入字符串并将其转换为java中的输出字符串?

Bar*_*ers 6

核心API中有一些类可用于href从锚标记中获取所有属性(如果存在!):

import java.io.*;
import java.util.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class HtmlParseDemo {
   public static void main(String [] args) throws Exception {

       String html =
           "<a href=\"http://stackoverflow.com\" >Take me to StackOverflow</a> " +
           "<!--                                                               " +
           "<a href=\"http://ignoreme.com\" >...</a>                           " +
           "-->                                                                " +
           "<a href=\"http://www.google.com\" >Take me to Google</a>           " +
           "<a>NOOOoooo!</a>                                                   ";

       Reader reader = new StringReader(html);
       HTMLEditorKit.Parser parser = new ParserDelegator();
       final List<String> links = new ArrayList<String>();

       parser.parse(reader, new HTMLEditorKit.ParserCallback(){
           public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
               if(t == HTML.Tag.A) {
                   Object link = a.getAttribute(HTML.Attribute.HREF);
                   if(link != null) {
                       links.add(String.valueOf(link));
                   }
               }
           }
       }, true);

       reader.close();
       System.out.println(links);
   }
}
Run Code Online (Sandbox Code Playgroud)

将打印:

[http://stackoverflow.com, http://www.google.com]


Jig*_*shi 5

您可以使用JSoup

String html = "<p>An <a href=\"http://stackoverflow.com\" >Take me to StackOverflow</a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();

String linkHref = link.attr("href"); // "http://stackoverflow.com"
Run Code Online (Sandbox Code Playgroud)

另请参阅


Op *_*kel 5

public static void main(String[] args) {
    String test = "qazwsx<a href=\"http://stackoverflow.com\">Take me to StackOverflow</a>fdgfdhgfd"
            + "<a href=\"http://stackoverflow2.com\">Take me to StackOverflow2</a>dcgdf";

    String regex = "<a href=(\"[^\"]*\")[^<]*</a>";

    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(test);
    System.out.println(m.replaceAll("$1"));
}
Run Code Online (Sandbox Code Playgroud)

注意:所有 Andrzej Doyle 的观点都是有效的,如果您的输入比简单的多<a href="X">Y</a>,并且您确定这是可解析的 HTML,那么您最好使用 HTML 解析器。

总结一下:

  1. 如果您发表评论,我发布的正则表达式将不起作用<a>。(您可以将其视为特殊情况)
  2. 如果标签中有其他属性,则它不起作用<a>。(同样,您可以将其视为特殊情况)
  3. 还有许多其他情况正则表达式不起作用,并且您不能用正则表达式涵盖所有这些情况,因为 HTML 不是常规语言。

但是,如果您的请求始终替换<a href="X">Y</a>"X"而不考虑上下文,那么我发布的代码将起作用。

  • -1:[HTML不是常规语言](http://stackoverflow.com/questions/1732348/regex-match-open-tags- except-xhtml-self-contained-tags/1732454#1732454)。(需要我多说?) (3认同)
  • 很多很多的投入。`&lt;a class="stripey" href="http://stackoverflow.com"&gt;带我...&lt;/a&gt;` 会给出假阴性。`&lt;!-- 现在将其注释掉 &lt;a href="http://stackoverflow.com"&gt;带我...&lt;/a&gt; --&gt;` 将给出误报。在这两种情况下,使用 HTML 解析器都可以正确提取“href”属性(包括在第二种情况下根本找不到该元素)。 (2认同)