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

What language/tool should I use for HTML parsing?

提问人:Martin 提问时间:2/24/2009 最后编辑:Zoe is on strikeMartin 更新时间:6/6/2021 访问量:4472

问:

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

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

屏幕抓取 html 解析

评论

0赞 Jonny Buchanan 2/24/2009
您能详细说明一下 BeautifulSoup 的“不起作用”吗?否则我会建议的。

答:

5赞 cletus 2/24/2009 #1

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

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

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

0赞 Colin Pickard 2/24/2009 #2

hpricot 可能就是你要找的。

评论

1赞 ThinkingStiff 11/15/2012
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。
0赞 Colin Pickard 11/15/2012
赞成。出于这个原因,我(早在 2009 年)就投了斯图尔特·罗宾逊 (Stewart Robinson) 的票。但如今,您可能无论如何都想使用 Nokogiri 而不是 hpricot。
0赞 Ionuț G. Stan 2/24/2009 #3

您可以尝试 PHP 的 DOMDocument 类。它有几种加载 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();
2赞 Stewart Robinson 2/24/2009 #4

我认为 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

评论

0赞 Martin 2/25/2009
我按照他们网站上的说明进行操作,但无法安装 scribyt。有什么想法吗?C:\Windows\system32>gem install mechanize 安装所需的依赖锄头?[YN]Y 错误:在执行 gem 时...(Gem::GemNotFoundException)在任何存储库中都找不到锄头 (>= 1.9.0)
0赞 Stewart Robinson 2/25/2009
您可能需要尝试安装以前的版本。Scrubyt 过去一直非常具体地说明其依赖项的版本。我让它在 Mac 上运行,而不是 Win,所以在那里帮不上什么忙。我的编译器必须在路径中才能将其作为旁白安装
2赞 cuneytykaya 1/4/2013 #5

作为语言 Java 和开源库,Jsoup 对你来说将是一个很好的解决方案。

0赞 Boris Ivanov 9/10/2015 #6

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

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