我使用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");
}
}
}
答案 0 :(得分:9)
我使用HTML Parser相当可靠地执行此操作(假设HTML文档不会更改其结构)。具有稳定API的Web服务要好得多,但有时我们只有一个。
一般想法:
首先,您必须知道所需信息(div
,meta
,span
等),并了解识别这些标记的属性。示例:
<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)