例如有这样一个字符串:
<a href="LINK_1" class="am"> Some Text</a>.. ANYTHING ..<a href="LINK_2" class="am"> Some Text</a><a href="SEARCHED_HREF_TO_EXTRACT" class="am"> SEARCHED_TEXT</a>..
我需要从HTML链接中提取一个&#39; href&#39;属性值,来自包含一些搜索词的链接,例如&#39; SEARCHED_TEXT&#39;在例子中。你能建议一下,如何正确地做到这一点? 不会问是否已经发送了很多时间=)
我去了这个,但不可思议的是它工作不正确..
String str = "<a href=\"LINK_1\" class=\"am\"> Some Text</a>.. ANYTHING ..<a href=\"LINK_2\" class=\"am\"> Some Text</a><a href=\"SEARCHED_HREF_TO_EXTRACT\" class=\"am\"> SEARCHED_TEXT</a>";
Pattern pattern = Pattern.compile("<a.*?href=\"(.*?)\".*SEARCHED_TEXT</a>");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(0)); // matched whole string
System.out.println(matcher.group(1)); // should be SEARCHED_HREF_TO_EXTRAC
我知道在href =&#34;(。*?)&#34;之后我需要进行一些谈判。接受除
之外的所有符号</a>
找到正确的HREF,但无法使其正常工作:(
答案 0 :(得分:1)
不要在这里使用正则表达式,因为它不适合处理嵌套结构(在Java中使用的最后正则表达式,因为它不支持递归),如HTML / XML
(更多信息:Can you provide some examples of why it is hard to parse XML and HTML with a regex?)。
正确的工具是HTML / XML解析器。我可能会选择jsoup,因为它的简单性和CSS查询支持。
所以你的代码看起来像:
String html = "<a href=\"LINK_1\" class=\"am\"> Some Text</a>.. ANYTHING ..<a href=\"LINK_2\" class=\"am\"> Some Text</a><a href=\"SEARCHED_HREF_TO_EXTRACT\" class=\"am\"> SEARCHED_TEXT</a>";
Document doc = Jsoup.parse(html);
Elements links = doc.select("a:contains(SEARCHED_TEXT)"); //contains is case-insensitive
System.out.println(links.attr("href"));
或者如果您希望找到许多链接迭代找到的元素并从每个元素中获取href
属性:
for(Element link : links){
System.out.println(link.attr("href"));
}
答案 1 :(得分:1)
好吧,如果我正确阅读,你想要提取文本与搜索词匹配的链接的href。
如果是这种情况,可以通过略微修改正则表达式来实现
String str = "<a href=\"LINK_1\" class=\"am\"> Some Text</a>.. ANYTHING ..<a href=\"LINK_2\" class=\"am\"> Some Text</a><a href=\"SEARCHED_HREF_TO_EXTRACT\" class=\"am\"> SEARCHED_TEXT</a>";
Pattern regex = Pattern.compile("<a\\s*href=[\"']([^'\"]+?)[\"'][^>]*?>\\s*SEARCHED_TEXT\\s*</a>", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher regexMatcher = regex.matcher(str);
while (regexMatcher.find()) {
System.out.println(regexMatcher.group(1));
}
上面的代码段,只会提取SEARCHED_HREF_TO_EXTRACT。