提问人:Martin 提问时间:2/24/2009 最后编辑:Zoe is on strikeMartin 更新时间:6/6/2021 访问量:4472
我应该使用什么语言/工具进行 HTML 解析?
What language/tool should I use for HTML parsing?
问:
我有几个网站,我想从中提取数据,并根据以前的经验,这并不像听起来那么容易。为什么?仅仅是因为我必须解析的 HTML 页面格式不正确(缺少结束标记等)。
考虑到我对可以使用的技术、语言或工具没有任何限制,您对轻松解析和提取 HTML 页面的数据有什么建议?我尝试过 HTML Agility Pack、BeautifulSoup,甚至这些工具也不完美(HTML Agility Pack 有问题,BeautifulSoup 解析引擎不适用于我传递给它的页面)。
答:
你几乎可以使用任何你喜欢的语言,只是不要尝试用正则表达式解析HTML。
因此,让我重新表述一下:您可以使用任何您喜欢的具有 HTML 解析器的语言,这几乎是过去 15-20 年发明的所有东西。
如果您在特定页面上遇到问题,我建议您考虑使用 HTML Tidy 修复它们。
hpricot 可能就是你要找的。
评论
您可以尝试 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();
我认为 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
评论
作为语言 Java 和开源库,Jsoup 对你来说将是一个很好的解决方案。
任何在 DOM 级别上与 HTML 一起使用的语言都是好的。
对于perl,它是HTML::TreeBuilder模块。
评论