我应该使用哪种语言/工具来解析HTML?

6
我有一些网站想要从中提取数据,但根据以往经验,这并不像听起来那么容易。为什么呢?因为我需要解析的HTML页面格式不正确(缺少闭合标签等)。
考虑到没有关于技术、语言或工具的限制,您有什么建议可以轻松地解析和提取HTML页面中的数据吗?我已经尝试过HTML Agility Pack、BeautifulSoup,但甚至这些工具也并不完美(HTML Agility Pack存在bug,而BeautifulSoup解析引擎无法处理我传递给它的页面)。

关于BeautifulSoup的“不起作用”,你能详细说明一下吗?否则我本来会建议使用它的。 - Jonny Buchanan
6个回答

5
你可以使用任何你喜欢的编程语言,但不要试图用正则表达式解析HTML。

因此,让我重新表述一下:你可以使用任何具有HTML解析器的编程语言,这几乎包括过去15-20年中发明的所有编程语言。

如果你在处理特定网页时遇到问题,建议你使用HTML Tidy进行修复。


2
我认为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 安装所需的依赖项hoe?[Yn] Y 错误:执行gem时出错...(Gem :: GemNotFoundException) 在任何存储库中都找不到hoe(> = 1.9.0) - Martin
你可能想尝试安装以前的版本。Scrubyt过去对其依赖项的版本非常具体。我已经在Mac上使其工作,但不是在Win上,所以无法提供太多帮助。顺便说一下,我的编译器必须在路径中才能安装它。 - Stewart Robinson

2
作为一种语言,Java和开源库Jsoup(Jsoup)将是一个不错的解决方案。

0

你可以尝试使用PHP的DOMDocument类。它有几种加载HTML内容的方法。我通常使用这个类。我的建议是,在解析HTML之前,将DOCTYPE元素添加到HTML中(如果没有),并在Firebug中检查解析后的HTML。在某些情况下,当遇到无效的标记时,DOMDocument会对HTML元素进行一些重新排列。此外,如果源代码中有指定字符集的meta标签,请注意它将在解析标记时由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();

0
任何能够在DOM级别上与HTML一起工作的语言都是好的。
对于Perl来说,它是HTML::TreeBuilder模块。

0

hpricot 可能是你正在寻找的。


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - ThinkingStiff
是的。我当时(2009年)支持过Stewart Robinson,就是因为这个原因。但是这些天你可能更想使用Nokogiri而不是hpricot。 - Colin Pickard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接