【问题标题】:Get all Images from WebPage Program | Java从网页程序中获取所有图像 |爪哇
【发布时间】:2011-01-11 11:29:06
【问题描述】:

目前我需要一个给定 URL 的程序,返回网页上所有图像的列表。

即:

logo.png 画廊1.jpg 测试.gif

在我尝试编写代码之前,有没有可用的开源软件?

语言应该是java。谢谢 菲利普

【问题讨论】:

  • 您需要程序还是库?
  • 对不起是什么意思?我只需要一个 .jar 文件或可以链接到我正在编写的现有 Java 程序的东西。我想程序会很简单,我只需要图像提取的操作
  • 我认为您不会找到任何完全适合您的方案的此类库。您将不得不使用解析器并自己编写一些下载代码。

标签: java image extract


【解决方案1】:

只需使用simple HTML parser,例如jTidy,然后使用get all elements by tag name img,然后在List<String>List<URI> 中收集每个src 属性。

您可以使用URL#openStream() 获得URLInputStream,然后将其提供给您喜欢使用的任何HTML 解析器。这是一个启动示例:

InputStream input = new URL("http://www.stackoverflow.com").openStream();
Document document = new Tidy().parseDOM(input, null);
NodeList imgs = document.getElementsByTagName("img");
List<String> srcs = new ArrayList<String>();

for (int i = 0; i < imgs.getLength(); i++) {
    srcs.add(imgs.item(i).getAttributes().getNamedItem("src").getNodeValue());
}

for (String src: srcs) {
    System.out.println(src);
}

但我必须承认 Bozho 建议的 HtmlUnit 确实看起来更好。

【讨论】:

  • 并且 htmlunit 大致按照您的回答进行,因此 +1 用于澄清究竟应该发生什么。
  • HtmlUnit 不像 jTidy 那样臃肿。它提供了内置方法来打开网页并使用 XPath 获取感兴趣的元素/属性。
【解决方案2】:

HtmlUnitHtmlPage.getElementsByTagName("img"),这可能适合你。

(阅读简短的Get started 指南,了解如何获取正确的HtmlPage 对象)

【讨论】:

    【解决方案3】:

    使用HTML Parser(以及任何其他体面的 HTML 解析器)非常简单:

    Parser parser = new Parser("http://www.yahoo.com/");
    NodeList list = parser.parse(new TagNameFilter("IMG"));
    
    for ( SimpleNodeIterator iterator = list.elements(); iterator.hasMoreNodes(); ) {
        Tag tag = (Tag) iterator.nextNode();
        System.out.println(tag.getAttribute("src"));
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用wget,它有很多可用选项。

      或谷歌java wget ...

      【讨论】:

        【解决方案5】:

        您可以解析 HTML,并在 Collection 中收集 IMG 元素的所有 SRC 属性。然后从每个 url 下载每个资源并将其写入文件。对于解析,有几个可用的 HTML 解析器,Cobra 就是其中之一。

        【讨论】:

          【解决方案6】:

          使用 Open Graph 标记和 HTML 单元,您可以非常轻松地提取数据(PageMeta 是一个保存结果的简单 POJO):

              Parser parser = new Parser(url);
          
              PageMeta pageMeta = new PageMeta();
              pageMeta.setUrl(url);
          
              NodeList meta = parser.parse(new TagNameFilter("meta"));
              for (SimpleNodeIterator iterator = meta.elements(); iterator.hasMoreNodes(); ) {
                  Tag tag = (Tag) iterator.nextNode();
          
                  if ("og:image".equals(tag.getAttribute("property"))) {
                      pageMeta.setImageUrl(tag.getAttribute("content"));
                  }
          
                  if ("og:title".equals(tag.getAttribute("property"))) {
                      pageMeta.setTitle(tag.getAttribute("content"));
                  }
          
                  if ("og:description".equals(tag.getAttribute("property"))) {
                      pageMeta.setDescription(tag.getAttribute("content"));
                  }
              }
          

          【讨论】:

            【解决方案7】:

            你可以简单地在 Java 中使用正则表达式

            <html>
            <body>
            <p>
            <img src="38220.png" alt="test" title="test" /> 
            <img src="32222.png" alt="test" title="test" />
            </p>
            </body>
            </html>
                String s ="html";  //above html content
                Pattern p = Pattern.compile("<img [^>]*src=[\\\"']([^\\\"^']*)");
                Matcher  m = p.matcher (s);
                while (m.find()) {
                    String src = m.group();
                    int startIndex = src.indexOf("src=") + 5;
                    String srcTag = src.substring(startIndex, src.length());
                    System.out.println( srcTag );
                }
            

            【讨论】:

              猜你喜欢
              • 2017-08-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多