【问题标题】:How do you grab a text from webpage (Java)?你如何从网页(Java)中获取文本?
【发布时间】:2010-09-09 10:43:32
【问题描述】:
我打算编写一个简单的 J2SE 应用程序来聚合来自多个 Web 源的信息。
我认为,最困难的部分是从网页中提取有意义的信息,如果它不能作为 RSS 或 Atom 提要提供的话。例如,我可能想从 stackoverflow 中提取问题列表,但我绝对不需要那个巨大的标签云或导航栏。
您会建议什么技术/库?
更新/备注
- 速度无关紧要 - 只要它可以在 10 分钟内解析大约 5MB 的 HTML。
- 应该很简单。
【问题讨论】:
标签:
java
html
html-content-extraction
【解决方案3】:
如果您想利用任何结构或语义标记,您可能想探索将 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>
【解决方案4】:
简而言之,您可以解析整个页面并选择您需要的内容(为了提高速度,我建议查看 SAXParser)或通过修剪所有 HTML 的正则表达式运行 HTML...您也可以将其全部转换到 DOM 中,但这会很昂贵,特别是如果您希望获得不错的吞吐量。
【解决方案5】:
您似乎想要筛选屏幕。您可能希望通过每个源站点的适配器/插件编写一个框架(因为每个站点的格式会有所不同),您可以解析 html 源并提取文本。您可能会使用 java 的 io API 连接到 URL 并通过 InputStreams 流式传输数据。
【解决方案6】:
如果你想用老式的方式来做,你需要用一个套接字连接到网络服务器的端口,然后发送以下数据:
GET /file.html HTTP/1.0
Host: site.com
<ENTER>
<ENTER>
然后使用 Socket#getInputStream ,然后使用 BufferedReader 读取数据,并使用您喜欢的任何方式解析数据。
【解决方案7】:
您可以使用nekohtml 来解析您的html 文档。您将获得一个 DOM 文档。您可以使用 XPATH 来检索您需要的数据。
【解决方案8】:
如果您的“网络资源”是使用 HTML 的常规网站(而不是像 RSS 这样的结构化 XML 格式),我建议您查看HTMLUnit。
这个库虽然是针对测试的,但实际上是一个通用的“Java 浏览器”。它建立在 Apache httpclient、Nekohtml 解析器和 Rhino 之上,以支持 Javascript。它为网页提供了一个非常好的 API,并允许轻松地遍历网站。
【解决方案9】:
您是否考虑过利用 RSS/Atom 提要?当内容通常以可消耗的格式提供给您时,为什么要抓取内容?有一些库可用于以您能想到的任何语言使用 RSS,与尝试抓取内容相比,它对页面标记的依赖要少得多。
如果您绝对必须抓取内容,请在标记中查找 microformats,大多数博客(尤其是基于 WordPress 的博客)默认都有此功能。还有一些库和解析器可用于从网页中定位和提取微格式。
最后,聚合服务/应用程序(例如 Yahoo Pipes)也许能够为您完成这项工作,而无需重新发明轮子。