从HTML代码中提取图像URL的正则表达式

3

我希望能从HTML代码中提取图像的URL,例如下面的HTML代码:

<div class="imageContainer">
   <img src="http://ecx.images-amazon.com/images/I/41%2B7N48F7JL._SL135_.jpg"
      alt="" width="135" height="94"
      style="margin-top: 21px; margin-bottom:20px;" /></div>

我从网络上获取了一段代码

String regexImage = "(?<=<img (*)src=\")[^\"]*";
Pattern pImage = Pattern.compile(regexImage);
Matcher mImage = pImage.matcher(elementString);
while (mImage.find()) {
   String imagePath = mImage.group();}

这是一个正常运行且具有正则表达式的程序。

"(?<=<img src=\")[^\"]*"

但现在我想从以下类似的HTML代码中提取图像URL:

<img onerror="img_onerror(this);" data-logit="true" data-pid="MOBDDDBRHVWQZHYY"
   data-imagesize="thumb"
   data-error-url="http://img1a.flixcart.com/mob/thumb/mobile.jpg"
   src="http://img8a.flixcart.com/image/mobile/h/y/y/samsung-galaxy-s-duos-s7562-125x125-imadddczzr4qhqnc.jpeg"
   alt="Samsung Galaxy S Duos S7562: Mobile"
   title="Samsung Galaxy S Duos S7562: Mobile"></img></a>
<div class="bp-offer-image image-offer"></div>

在`img`和`src=`之间的代码是需要翻译的内容。
我正在尝试使用正则表达式:"(?<=<img (*)src=\")[^\"]*",但它不起作用。请提供一个正则表达式,以便从上述HTML代码中提取图像URL,即http://ecx.images-amazon.com/images/I/61xqOQ3Sj8L._SL135_.jpg
首先,我使用Jsoup解析HTML以提取包含img的标签:
doc = Jsoup.connect(urlFromBrowse).get();
            Elements elements = doc.getElementsByTag("img");

            for (Element element : elements) {
                String elementString = element.toString();

我将这个elementString传递给matcher()方法。从我获取的标签(element)中,我使用正则表达式来解析图片url、名称等内容。


3
不要使用正则表达式。将其解析为HTML代码。 - Anirudh Ramanathan
2
解析格式良好的HTML很容易,但如果不规范就会是一场噩梦! - Aubin
刚看到这个放在首页上了。Java肯定有一些DOM解析器。调查一下这个,而不是用正则表达式。 - Joel Berger
谢谢您的评论,但是嘿,伙计们,我已经工作了2周了,现在几乎完成了我想要的东西,只剩下一个正确的正则表达式。现在我不能从头开始使用其他技术来解析它。所以请有人给我那个正则表达式。 - user1699548
不,你已经在使用DOM解析器了,所以继续使用它吧。为什么要错误地做呢,当你几乎做对了呢? - Joel Berger
显示剩余3条评论
3个回答

5

本文是对问题的回答,而不是一份指南。

这个问题不是“RegExp vs DOM”,而是“从HTML代码中提取图像URL的正则表达式”。

以下是答案:

String htmlFragment =
   "<img onerror=\"img_onerror(this);\" data-logit=\"true\" data-pid=\"MOBDDDBRHVWQZHYY\"\n" + 
   "   data-imagesize=\"thumb\"\n" + 
   "   data-error-url=\"http://img1a.flixcart.com/mob/thumb/mobile.jpg\"\n" + 
   "   src=\"http://img8a.flixcart.com/image/mobile/h/y/y/samsung-galaxy-s-duos-s7562-125x125-imadddczzr4qhqnc.jpeg\"\n" + 
   "   alt=\"Samsung Galaxy S Duos S7562: Mobile\"\n" + 
   "   title=\"Samsung Galaxy S Duos S7562: Mobile\"></img></a>";
Pattern pattern =
   Pattern.compile( "(?m)(?s)<img\\s+(.*)src\\s*=\\s*\"([^\"]+)\"(.*)" );
Matcher matcher = pattern.matcher( htmlFragment );
if( matcher.matches()) {
   System.err.println(
      "OK:\n" +
      "1: '" + matcher.group(1) + "'\n" +
      "2: '" + matcher.group(2) + "'\n" +
      "3: '" + matcher.group(3) + "'\n" );
}

输出结果为:

OK:
1: 'onerror="img_onerror(this);" data-logit="true" data-pid="MOBDDDBRHVWQZHYY"
   data-imagesize="thumb"
   data-error-url="http://img1a.flixcart.com/mob/thumb/mobile.jpg"
   '
2: 'http://img8a.flixcart.com/image/mobile/h/y/y/samsung-galaxy-s-duos-s7562-125x125-imadddczzr4qhqnc.jpeg'
3: '
   alt="Samsung Galaxy S Duos S7562: Mobile"
   title="Samsung Galaxy S Duos S7562: Mobile"></img></a>'

不那么嘲讽地说,这个程序如何比DOM解析器更好地处理旧的、格式不良的HTML?你怎么知道DOM解析器一开始就无法处理它呢? - Joel Berger
嘿,你很棒,但我认为你犯了一个错误。因为你的代码在这里运行得很好,但在我的代码中却不行。我认为原因是你在每个引号前都使用了反斜杠,并为此设计了正则表达式,但在代码中并没有反斜杠。所以请给出相应的正则表达式,你是我最后的希望。 - user1699548
你提供的示例代码包含“。请提供真实HTML源代码的URL。 - Aubin
我正在尝试一个类似于http://pinterest.com/的应用程序。上面的HTML代码示例是来自http://www.amazon.com/的HTML标签。 - user1699548
在上面的例子中,if( matcher.matches() ) 可能是不正确的;它应该改为 while( matcher.find() ) 吗? - Andrew Wyld
@Aubin,我该如何使用jsoup在Java中更改多个不同图像的src?你能帮我回答这个问题吗?http://stackoverflow.com/questions/39095067/how-to-change-src-for-multiple-images-in-android - AndroidNewBee

2
根据文档,JSoup(一种DOM解析器)可以在获取标签元素后轻松获取属性。类似这样的代码:
doc.getElementsByTag("img").attr("src")

应该可以工作。

我是一个Perl程序员,我们这个社区经常过于依赖正则表达式。我一直在努力启发人们使用DOM解析器而不是脆弱的正则表达式。


是的,对于x-html可以使用DOM,但对于格式不正确的HTML(3.2),它不适用。 - Aubin
谁说了什么关于格式不正确的HTML 3.2? - Joel Berger
这似乎是我想要的,我会尝试一下并回来。顺便说一句,谢谢。 - user1699548
你可能需要循环遍历标签元素,请参阅 Elements 类的文档以获取辅助方法。 - Joel Berger
谢谢提供有用的链接,因为在我的Eclipse中,我无法获取任何JSoup方法的鼠标悬停文档。 - user1699548

0

我希望你能够通过JSoup API获取元素的各种属性。Node.attributes()是否给你想要的结果?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接