C#中HTML/XML处理及正则表达式

HTML Parser
一个比较方便的html解析package是HtmlAgilityPack,可以按照如下图显示在Visual Studio中安装。
C#中HTML/XML处理及正则表达式_第1张图片

使用该包的一个简单实例代码如下:

        public static bool CrawlCategoryReviewInfo(string categoryUrl)
        {
            var resp = HttpUtils.GetResponseData(categoryUrl);
            if (resp == null)
            {
                logger.Info("Failed to request the category page from Suning server!");
                return false;
            }
            HtmlDocument document = new HtmlDocument();
            document.LoadHtml(resp);
            HtmlNodeCollection collection = document.DocumentNode.SelectNodes("//div[@id='productTab']//li[contains(@class,'item')]");
            if (collection == null || collection.Count < 1) return false;
            foreach(HtmlNode prod in collection)
            {
                if (prod == null || prod.Attributes["name"] == null) continue;
                string prodId = prod.Attributes["name"].Value;
                if(prodId.StartsWith("000000000")) prodId = prodId.Substring(9);
                HtmlNode commentNode = prod.SelectSingleNode(".//a[contains(@name,'comment')]/i");
                if (commentNode == null) continue;
                int commentCount = int.Parse(commentNode.InnerText);
                Console.WriteLine(prodId + "\t" + commentCount);
            }
            if (collection.Count < int.Parse(ConfigurationManager.AppSettings["CAT_PAGE_ITEM_NUM"]))
                return false;
            return true;
        }

需要特别注意的是,对于在HtmlNode内部找子HtmlNode所写的xpath,xpath需要在前面加上”.”,如上面的”.//a[contains(@name,’comment’)]/i”,否则可能会发现找的是全局的Node。

XML DOM
系统空间System.Xml.Linq中的XDocument可以帮助解析或者输出XML文件。
1) 加载解析XML:

            var filePath = Path.Combine(path, "image_status.xml");
            XDocument doc = XDocument.Load(filePath);
            var pics = doc.Descendants("pic");

            foreach (var pic in pics)
            {
                string url = (string)pic.Element("url");
                string imgFile = (string)pic.Element("file");

                processedImages.Add(url, imgFile);
            }

2) 保存生成XML

            var filePath = Path.Combine(path, "image_status.xml");
            var docUpdate = new XElement("status");

            foreach (var tuple in processedImages)
            {
                var item = new XElement("image");
                item.Add(new XElement("url", tuple.Key));
                item.Add(new XElement("file", tuple.Value));

                docUpdate.Add(item);
            }

            docUpdate.Save(filePath);

正则表达式抽取
利用正则表达式来抽取信息,其实不同语言的逻辑都一样,语法略有不同。这里不做介绍,仅仅给出一个抽取的例子作为参考。注意每一个匹配部分会用”?<—>”开头来对该Group命名,后面取匹配的数据的时候就可以借助这个名字得到相应的匹配值。

        public static void CrawlProductReviewInfo()
        {
            string resp = "satisfy({\"reviewCounts\":[{\"oneStarCount\":2,\"twoStarCount\":0,\"threeStarCount\":23,\"fourStarCount\":43,\"fiveStarCount\":431,\"againCount\":4,\"bestCount\":0,\"picFlagCount\":5,\"totalCount\":499,\"qualityStar\":4.8}],\"returnCode\":\"1\",\"returnMsg\":\"成功获取评价个数\"})";
            Regex revRegex = new Regex("\"totalCount\":(?.*?),\"qualityStar\":(?.*?)}"); 
            MatchCollection mc = revRegex.Matches(resp);
            if (mc.Count > 0)
            {
                var comment = decimal.Parse(mc[0].Groups["comment"].Value);
                var score = decimal.Parse(mc[0].Groups["score"].Value);
            }
        }

你可能感兴趣的:(c#)