【问题标题】:What language/tool should I use for HTML parsing?我应该使用什么语言/工具进行 HTML 解析?
【发布时间】:2010-10-09 13:50:00
【问题描述】:

我有几个网站,我想从以前的经验中提取数据,这并不像听起来那么容易。为什么?仅仅是因为我必须解析的 HTML 页面格式不正确(缺少结束标记等)。

考虑到我对可以使用的技术、语言或工具没有任何限制,您对轻松解析和提取 HTML 页面中的数据有什么建议?我尝试过 HTML Agility Pack、BeautifulSoup,甚至这些工具都不是完美的(HTML Agility Pack 有问题,BeautifulSoup 解析引擎无法处理我传递给它的页面)。

【问题讨论】:

  • 您能否详细说明 BeautifulSoup 的“不起作用”?否则我会建议的。

标签: html screen-scraping html-parsing


【解决方案1】:

在 DOM 级别上使用 HTML 的任何语言都是好的。

对于 perl,它是 HTML::TreeBuilder 模块。

【讨论】:

    【解决方案2】:

    作为 Java 语言和开源库 Jsoup 将是您的完美解决方案。

    【讨论】:

      【解决方案3】:

      我认为 hpricot(由 Colin Pickard 链接)是王牌。将scrubyt 添加到组合中,您将获得一个出色的html 抓取和浏览界面以及Ruby http://scrubyt.org/ 的文本匹配功能@

      这是来自http://github.com/scrubber/scrubyt_examples/blob/7a219b58a67138da046aa7c1e221988a9e96c30e/twitter.rb的一些示例代码

      require 'rubygems'
      require 'scrubyt'
      
      # Simple exmaple for scraping basic
      # information from a public Twitter
      # account.
      
      # Scrubyt.logger = Scrubyt::Logger.new
      
      twitter_data = Scrubyt::Extractor.define do
        fetch 'http://www.twitter.com/scobleizer'
      
        profile_info '//ul[@class="about vcard entry-author"]' do
          full_name "//li//span[@class='fn']"
          location "//li//span[@class='adr']"
          website "//li//a[@class='url']/@href"
          bio "//li//span[@class='bio']"
        end
      end
      
      puts twitter_data.to_xml
      

      【讨论】:

      • 我按照他们网站上的说明进行操作,但无法安装 scribyt。任何想法? C:\Windows\system32>gem install mechanize 安装所需的依赖锄头? [Yn] Y 错误:执行 gem 时 ... (Gem::GemNotFoundException) 在任何存储库中找不到锄头 (>= 1.9.0)
      • 您可能想尝试安装以前的版本。 Scrubyt 过去一直非常具体地说明其依赖项的版本。我让它在Mac上工作,而不是Win,所以在那里帮不上太多忙。我的编译器必须在路径中才能将其作为旁白安装
      【解决方案4】:

      你可以试试 PHP 的 DOMDocument 类。它有几种加载 HTML 内容的方法。我通常使用这个类。我的建议是在 HTML 中添加一个 DOCTYPE 元素以防它没有,并在 Firebug 中检查解析后产生的 HTML。在某些情况下,遇到无效标记时,DOMDocument 会对 HTML 元素进行一些重新排列。此外,如果有一个元标记指定源中的字符集,请注意它会在解析标记时被 libxml 内部使用。这是一个小例子

      $html = file_get_contents('http://example.com');
      
      $dom = new DOMDocument;
      $oldValue = libxml_use_internal_errors(true);
      $dom->loadHTML($html);
      libxml_use_internal_errors($oldValue);
      
      echo $dom->saveHTML();
      

      【讨论】:

        【解决方案5】:

        hpricot 可能就是您要找的。​​p>

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
        • 是的。出于这个原因,我支持斯图尔特罗宾逊(早在 2009 年)。但是这些天你可能会想要使用Nokogiri而不是hpricot。
        【解决方案6】:

        您几乎可以使用任何您喜欢的语言只是不要尝试使用正则表达式解析 HTML。

        所以让我换个说法说:你可以使用任何你喜欢的具有 HTML 解析器的语言,这几乎是过去 15 到 20 年发明的所有东西。

        如果您在使用特定页面时遇到问题,我建议您使用HTML Tidy 进行修复。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-17
          • 2014-06-18
          相关资源
          最近更新 更多