我应该使用什么语言/工具进行HTML解析?

我应该使用什么语言/工具进行HTML解析?,html,screen-scraping,html-parsing,Html,Screen Scraping,Html Parsing,我有几个网站,我想从中提取数据,并基于以前的经验,这并不像听起来那么容易。为什么?只是因为我必须解析的HTML页面格式不正确(缺少结束标记等) 考虑到我对可以使用的技术、语言或工具没有任何限制,您对轻松解析和提取HTML页面中的数据有什么建议?我已经尝试过HTML Agility Pack和BeautifulSoup,甚至这些工具都不是完美的(HTML Agility Pack有缺陷,BeautifulSoup解析引擎无法处理我传递给它的页面)。你可以使用几乎任何你喜欢的语言,只是不要尝试用正则

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


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

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

让我重新表述一下,你可以使用任何你喜欢的有HTML解析器的语言,这几乎是过去15-20年发明的所有东西

如果您在特定页面上遇到问题,我建议您考虑使用修复它们。

可能就是您要寻找的。

您可以尝试使用PHP的类。它有两种加载HTML内容的方法。我通常利用这门课。我的建议是在HTML中预先添加DOCTYPE元素,以防没有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();
我认为hpricot(由科林·皮卡德联系)是王牌。将scrubyt添加到混合中,您将获得一个很棒的html抓取和浏览界面,具有Ruby的文本匹配功能

下面是来自的一些示例代码


Java语言和开源库对您来说将是一个非常好的解决方案。

任何在DOM级别使用HTML的语言都是不错的


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

您能详细说明一下关于BeautifulSoup的“不起作用”吗?否则的话,我会建议的。我按照他们网站上的说明进行操作,但我无法安装scribyt。有什么想法吗?C:\Windows\system32>gem安装机械化安装所需的依赖项hoe?[Yn]Y错误:执行gem时。。。(Gem::GemNotFoundException)在任何存储库中都找不到hoe(>=1.9.0)。您可能希望尝试安装以前的版本。Scrubyt过去对其依赖项的版本非常具体。我让它在Mac上工作,而不是在Win上,所以在那里帮不上什么忙。我的编译器必须在路径中安装它作为一个ASIDE虽然这个链接可以回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。是。出于这个原因,我在2009年投票给了斯图尔特·罗宾逊。但这些天你可能想用hpricot而不是hpricot。
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