我们如何从网页(Java)抓取文本?

时间:2020-03-05 18:55:43  来源:igfitidea点击:

我打算编写一个简单的J2SE应用程序,以汇总来自多个Web来源的信息。

我认为,最困难的部分是从网页中提取有意义的信息(如果不能作为RSS或者Atom提要使用)。例如,我可能想从stackoverflow中提取问题列表,但我绝对不需要那种巨大的标签云或者导航栏。

我们会建议什么技术/图书馆?

更新/备注

  • 只要速度可以在不到10分钟的时间内解析大约5MB的HTML,速度就无关紧要。
  • 真的很简单。

解决方案

回答

简而言之,我们既可以解析整个页面并选择所需的内容(为了提高速度,建议我们查看SAXParser),也可以通过对所有HTML进行修整的正则表达式来运行HTML ...我们还可以将其全部转换为DOM,但这将是昂贵的,特别是如果我们因具有不错的吞吐量而进行拍摄时。

回答

我们似乎想要屏幕刮擦。我们可能希望编写一个框架,该框架通过每个源站点的适配器/插件(因为每个站点的格式会有所不同),我们可以解析html源并提取文本。我们可能会使用Java的io API连接到URL并通过InputStreams传输数据。

回答

我们可以看看httpunit是如何做到的。他们使用了几个不错的html解析器,其中一个是nekohtml。
至于获取数据,我们可以使用jdk(httpurlconnection)内置的内容,也可以使用apache的

http://hc.apache.org/httpclient-3.x/

回答

我们可以结合使用HTMLParser(http://htmlparser.sourceforge.net/)和URL#getInputStream()来解析Internet上托管的HTML页面的内容。

回答

如果要使用老式方法,则需要使用套接字连接到Web服务器的端口,然后发送以下数据:

GET /file.html HTTP/1.0
Host: site.com
<ENTER>
<ENTER>

然后使用Socket#getInputStream,然后使用BufferedReader读取数据,并根据需要解析数据。

回答

如果要利用任何结构或者语义标记,则可能需要探索将HTML转换为XML,并使用XQuery以标准形式提取信息。看一下这篇IBM developerWorks文章,了解一些典型的代码,摘录如下(它们输出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>

回答

我们可以使用nekohtml解析html文档。我们将获得一个DOM文档。我们可以使用XPATH检索所需的数据。

回答

如果"网络资源"是使用HTML的常规网站(而不是RSS等结构化XML格式),那么我建议我们看一下HTMLUnit。

该库虽然针对测试,但却是一个真正的通用" Java浏览器"。它建立在Apache httpclient,Nekohtml解析器和Rhino上,以支持Javascript。它为网页提供了一个非常不错的API,并允许轻松遍历网站。

回答

我们是否考虑过利用RSS / Atom提要?当通常以消耗性格式提供给内容时,为什么要对其进行抓取?可以使用几乎我们能想到的任何一种语言来使用RSS的库,并且与尝试抓取内容相比,它对页面标记的依赖性要小得多。

如果我们绝对必须抓取内容,请在标记中查找微格式,大多数博客(尤其是基于WordPress的博客)默认情况下都具有此格式。还有一些库和解析器可用于从网页中查找和提取微格式。

最后,诸如Yahoo Pipes之类的聚合服务/应用程序也许可以为我们完成这项工作,而无需重新发明轮子。