如何使用HTML Parser获取有关HTML页面中所有标记的完整信息

时间:2010-02-18 10:32:49

标签: java screen-scraping

我使用HTML Parser开发应用程序。 下面的代码无法获取页面中的整个标记集。 有一些标签被遗漏,它们的属性和文本体也被遗漏了。 请帮我解释为什么会发生这种情况.....或者建议我采取其他方式......

 URL url = new URL("...");
 PrintWriter pw=new PrintWriter(new FileWriter("HTMLElements.txt"));

 URLConnection connection = url.openConnection();
 InputStream is = connection.getInputStream();
 InputStreamReader isr = new InputStreamReader(is);
 BufferedReader br = new BufferedReader(isr);

 HTMLEditorKit htmlKit = new HTMLEditorKit();
 HTMLDocument htmlDoc = (HTMLDocument)htmlKit.createDefaultDocument();
 HTMLEditorKit.Parser parser = new ParserDelegator();
 HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0);
 parser.parse(br, callback, true);

 ElementIterator iterator = new ElementIterator(htmlDoc);
 Element element;
   while ((element = iterator.next()) != null) 
   {
     AttributeSet attributes = element.getAttributes();
     Enumeration e=attributes.getAttributeNames();

     pw.println("Element Name :"+element.getName());
     while(e.hasMoreElements())
     {
      Object key=e.nextElement();
      Object val=attributes.getAttribute(key);
      int startOffset = element.getStartOffset();
   int endOffset = element.getEndOffset();
   int length = endOffset - startOffset;
   String text=htmlDoc.getText(startOffset, length);

      pw.println("Key :"+key.toString()+" Value :"+val.toString()+"\r\n"+"Text :"+text+"\r\n");

     }
   }

}

4 个答案:

答案 0 :(得分:9)

我使用HTML Parser相当可靠地执行此操作(假设HTML文档不会更改其结构)。具有稳定API的Web服务要好得多,但有时我们只有一个。

一般想法:

首先,您必须知道所需信息(divmetaspan等),并了解识别这些标记的属性。示例:

 <span class="price"> $7.95</span>

如果您正在寻找此“价格”,那么您对span“{1}}标签感兴趣。

HTML Parser具有逐个属性的功能。

class

当您使用过滤器进行解析时,您将获得一个filter = new HasAttributeFilter("class", "price"); 列表,您可以对它们执行Nodes操作,以确定它们是否属于您感兴趣的类型,instanceof 1}}你会做类似

的事情
span

查看支持的代码列表here

使用HTML Parser获取包含网站描述的元标记的示例:

标签示例:

if (node instanceof Span) // or any other supported element.

<强>代码:

<meta name="description" content="Amazon.com: frankenstein: Books"/> 

答案 1 :(得分:1)

根据评论:

  

实际上我想要提取在线购物网站上列出的所有产品的产品名称,价格等信息,例如amazon.com我该怎么办呢?

第1步:阅读他们的robots文件。它通常位于网站的根目录中,例如http://amazon.com/robots.txt。如果您尝试访问的网址由Disallow User-Agent上的*覆盖,则停止。联系他们,详细解释他们正在尝试做什么,并向他们询问可以为您提供所需信息的方式/替代方案/网络服务。否则,您违反了法律,您可能会被网站和/或您的ISP列入黑名单或更糟。如果没有,则继续执行步骤2.

第2步:检查相关网站是否还没有可用的公共网络服务,这比解析整个HTML网页要容易得多。使用Web服务,您将基于一组简单的参数以简明的格式(JSON或XML)获得您正在寻找的信息。查看或联系他们以获取有关任何Web服务的详细信息。如果没办法,请继续执行第3步。

第3步:了解HTML / CSS / JS的工作原理,了解如何使用Firebug等webdeveloper工具,了解如何解读右键单击的HTML / CSS / JS源代码&gt; 查看页面来源。我敢打赌,有问题的网站使用JS / Ajax来加载/填充您想要收集的信息。在这种情况下,你需要使用一个能够解析和执行JS的HTML解析器(你正在使用的那个就是不这样做)。这不是一件容易的事,所以我不会详细解释它,直到你完全清楚你想要实现什么,如果允许这样做,并且没有更容易使用的webservices可用。

答案 2 :(得分:0)

您似乎使用了Swing HtmlDocument。它可能不是最聪明的想法。 我相信你会有更好的结果,例如NekoHtml

答案 3 :(得分:0)

或者你可以使用的另一个简单的库是jtidy,它可以在解析之前清理你的html。 希望这会有所帮助。

http://sourceforge.net/projects/jtidy/

侨!