我有几个网站,我想从以前的经验中提取数据,这并不像听起来那么容易。为什么?仅仅是因为我必须解析的 HTML 页面格式不正确(缺少结束标记等)。
考虑到我对我可以使用的技术、语言或工具没有任何限制,您对轻松解析和提取 HTML 页面中的数据有什么建议?我尝试过 HTML Agility Pack、BeautifulSoup,甚至这些工具都不是完美的(HTML Agility Pack 有问题,BeautifulSoup 解析引擎不适用于我传递给它的页面)。
我有几个网站,我想从以前的经验中提取数据,这并不像听起来那么容易。为什么?仅仅是因为我必须解析的 HTML 页面格式不正确(缺少结束标记等)。
考虑到我对我可以使用的技术、语言或工具没有任何限制,您对轻松解析和提取 HTML 页面中的数据有什么建议?我尝试过 HTML Agility Pack、BeautifulSoup,甚至这些工具都不是完美的(HTML Agility Pack 有问题,BeautifulSoup 解析引擎不适用于我传递给它的页面)。
您可以使用几乎任何您喜欢的语言,只是不要尝试使用正则表达式解析 HTML。
所以让我换个说法说:你可以使用任何你喜欢的具有 HTML 解析器的语言,这几乎是过去 15 到 20 年发明的所有东西。
如果您遇到特定页面的问题,我建议您考虑使用HTML Tidy修复它们。
我认为 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将是一个非常适合您的解决方案。
hpricot可能是您正在寻找的。
你可以试试 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();
任何在 DOM 级别上使用 HTML 的语言都是好的。
对于 perl,它是 HTML::TreeBuilder 模块。