HTML解析器获取博客文章

| 我需要创建一个HTML解析器,给定一个博客URL,它返回一个列表,其中包含页面中的所有帖子。 即如果一个页面有10个帖子, 应该返回一个10格的列表, 每个div包含h1和 p 我无法使用它的rss feed,因为我需要确切知道它对用户的外观,如果它有任何广告,图片等,相反,某些博客只是对其内容的摘要,而feed则包含了所有内容,反之亦然。 无论如何,我已经制作了一个下载它的提要,并在html中搜索类似内容的方法,它对于某些博客非常有效,但对于其他博客却效果不佳。 我认为我不能为它所解析的博客中的100%创建一个解析器,但是我想尽可能地做到最好。 最好的方法是什么?寻找其id属性等于\“ post \”,\“ content \”的标签?寻找p标签?等等等等... 在此先感谢您的帮助!     
已邀请:
事实证明,“最佳可能”是“最佳合理的”。通过查看常见的博客工具(WordPress,LiveJournal等)如何生成其页面,并为每个页面专门编写代码,可以获取大量的博客。 事实证明,这是一个非常棘手的问题,因为每个博客工具都有自己的格式。您也许可以使用\“标准\”标识符(例如\“ post \”,\“ content \”等)来推断事物,但这令人怀疑。 您也会遇到广告方面的困难。许多广告都是使用JavaScript生成的。因此,下载页面将只为您提供JavaScript代码,而不是所生成的HTML。如果您确实要标识广告,则必须标识生成广告的JavaScript代码。或者,您的程序将必须执行JavaScript以创建最终的DOM。然后,您将面临与上述类似的问题:确定HTML的某些特定部分是否是广告。 有启发式方法有些成功。请查看“识别页面的主要内容”以找到类似问题的答案。     
我认为您不会在此方面取得成功。您也许可以解析一个博客,但是如果博客引擎更改了内容,它将不再起作用。我也不认为您将能够编写通用解析器。您甚至可能会取得部分成功,但这将是一次空想的成功,因为在这种情况下,一切都容易出错。如果需要内容,则应使用RSS。如果您需要存储(简单存储)外观,也可以这样做。但是按外观解析吗?我没有看到具体的成功。     
使用HTML Agility包。这是为此编写的HTML解析器。     
我刚刚为使用wordpress的公司博客做了类似的事情。这对我们来说是个好消息,因为我们的女主角博客多年来没有变,但其他博客都是对的,因为如果您的html发生了很大变化,解析将成为一个麻烦的解决方案。 这是我的建议: 使用Nuget安装RestSharp和HtmlAgilityPack。然后下载fizzler,并将这些参考添加到您的项目中(http://code.google.com/p/fizzler/downloads/list)。 这是一些我用来在我的网站上实现博客搜索的示例代码。
using System;
using System.Collections.Generic;
using Fizzler.Systems.HtmlAgilityPack;
using RestSharp;
using RestSharp.Contrib;

namespace BlogSearch
{
    public class BlogSearcher
    {
        const string Site = \"http://yourblog.com\";

        public static List<SearchResult> Get(string searchTerms, int count=10)
        {            
            var searchResults = new List<SearchResult>();

            var client = new RestSharp.RestClient(Site);
            //note 10 is the page size for the search results
            var pages = (int)Math.Ceiling((double)count/10);

            for (int page = 1; page <= pages; page++)
            {
                var request = new RestSharp.RestRequest
                                  {
                                      Method = Method.GET,
                                      //the part after .com/
                                      Resource = \"page/\" + page
                                  };

                //Your search params here
                request.AddParameter(\"s\", HttpUtility.UrlEncode(searchTerms));

                var res = client.Execute(request);

                searchResults.AddRange(ParseHtml(res.Content));
            }

            return searchResults;
        }

        public static List<SearchResult> ParseHtml(string html)
        {            
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            var results = doc.DocumentNode.QuerySelectorAll(\"#content-main > div\");

            var searchResults = new List<SearchResult>();
            foreach(var node in results)
            {
                bool add = false;
                var sr = new SearchResult();

                var a = node.QuerySelector(\".posttitle > h2 > a\");
                if (a != null)
                {
                    add = true;
                    sr.Title = a.InnerText;
                    sr.Link = a.Attributes[\"href\"].Value;
                }

                var p = node.QuerySelector(\".entry > p\");
                if (p != null)
                {
                    add = true;
                    sr.Exceprt = p.InnerText;
                }

                if(add)
                    searchResults.Add(sr);
            }

            return searchResults;
        }


    }

    public class SearchResult
    {
        public string Title { get; set; }
        public string Link { get; set; }
        public string Exceprt { get; set; }
    }
}
祝好运, 埃里克     

要回复问题请先登录注册