【问题标题】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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)也许能够为您完成这项工作,而无需重新发明轮子。

                  【讨论】:

                    【解决方案10】:

                    看看http://www.alchemyapi.com/api/demo.html

                    它们返回了相当不错的结果,并且拥有适用于大多数平台的 SDK。不仅是文本提取,它们还进行关键字分析等。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-09-26
                      • 2019-06-27
                      • 1970-01-01
                      • 2012-04-07
                      • 2014-03-24
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多