我打算编写一个简单的J2SE应用程序来聚合来自多个Web源的信息。
我认为,最困难的部分是从网页中提取有意义的信息,如果它不能用作RSS或Atom提要。例如,我可能想从stackoverflow中提取问题列表,但我绝对不需要那个巨大的标签云或导航栏。
你会建议什么技术/图书馆?
更新/备注
答案 0 :(得分:3)
您可以使用HTMLParser(http://htmlparser.sourceforge.net/)in与URL#getInputStream()组合来解析Internet上托管的HTML页面的内容。
答案 1 :(得分:2)
你可以看看httpunit是如何做到的。他们使用几个像样的html解析器,一个是nekohtml。 至于获取数据,您可以使用内置于jdk(httpurlconnection)中的内容,或使用apache的
答案 2 :(得分:2)
如果您想利用任何结构或语义标记,您可能希望探索将HTML转换为XML并使用XQuery以标准形式提取信息。看看this IBM developerWorks article的一些典型代码,摘录如下(他们输出HTML,当然,这不是必需的):
<table>
{
for $d in //td[contains(a/small/text(), "New York, NY")]
for $row in $d/parent::tr/parent::table/tr
where contains($d/a/small/text()[1], "New York")
return <tr><td>{data($row/td[1])}</td>
<td>{data($row/td[2])}</td>
<td>{$row/td[3]//img}</td> </tr>
}
</table>
答案 3 :(得分:0)
简而言之,你可以解析整个页面并选择你需要的东西(为了我建议查看SAXParser的速度)或通过一个修剪所有HTML的正则表达式运行HTML ...你也可以将它全部转换进入DOM,但这将是昂贵的,特别是如果你正在拍摄有一个不错的吞吐量。
答案 4 :(得分:0)
你似乎想要屏幕刮擦。您可能希望编写一个框架,通过每个源站点的适配器/插件(因为每个站点的格式不同),您可以解析html源并提取文本。您可能会使用java的io API连接到URL并通过InputStreams流式传输数据。
答案 5 :(得分:0)
如果你想用老式的方式做,你需要用套接字连接到网络服务器的端口,然后发送以下数据:
GET /file.html HTTP/1.0
Host: site.com
<ENTER>
<ENTER>
然后使用Socket#getInputStream
,然后使用BufferedReader读取数据,并使用您喜欢的任何内容解析数据。
答案 6 :(得分:0)
您可以使用nekohtml来解析您的html文档。您将获得一个DOM文档。您可以使用XPATH来检索所需的数据。
答案 7 :(得分:0)
如果您的“网络资源”是使用HTML的常规网站(而不是RSS等结构化XML格式),我建议您查看HTMLUnit。
这个库在进行测试时,是一个非常通用的“Java浏览器”。它建立在Apache httpclient,Nekohtml解析器和Rhino上,支持Javascript。它为网页提供了一个非常好的API,并允许轻松遍历网站。
答案 8 :(得分:0)
您是否考虑过利用RSS / Atom供稿?为什么在通常以耗材格式提供的内容时抓取内容?有几种库可以用你能想到的任何语言来消费RSS,并且它会比尝试刮取内容更少依赖于页面的标记。
如果您绝对必须抓取内容,请在标记中查找microformats,大多数博客(尤其是基于WordPress的博客)默认情况下都会这样做。还有一些库和解析器可用于从网页中定位和提取微格式。
最后,聚合服务/应用程序(例如Yahoo Pipes)可以为您完成此工作,而无需重新发明轮子。
答案 9 :(得分:0)
查看http://www.alchemyapi.com/api/demo.html
他们返回了相当不错的结果,并为大多数平台提供了SDK。不仅是文本提取,还包括关键字分析等。