别在迷恋正则表达式解析html了,好吗?
近段时间在论坛上面兴起了一股正则之风,不论做什么都喜欢用正则
你在后台解析json格式字符串,必须要用正则,好吧,你可能不知道用JavaScriptSerializer类,
你解析类似www.xxx.com?a=a1&b=b2&c=c3的querystring参数,必须用正则,好吧,你也可能不知道string.split方法
你解析html你还必须用正则,好吧,这就真没有必要了,因为在解析html用到正则的时候你很多时候就不得不用到平衡组,你很有可能卡在这里
正则的强大性与通用性就不提了,一般的处理完全够用了,你完全可以自己去“系统”的学习(注:系统学习正则),在配上RegexBuddy或者在线的正则(注:附注会提到内容)的工具就可以掌握一些常用的用法
但是去解析html,还是用专业的库去解析吧,虽然条条大路通罗马,你真没必要以铁人三项的精神去做用正则死嗑html。
其实解析html的库有满多不错的,如_HtmlAgilityPack,又或者Jumony,以及Java的解析库htmlparser(有.net版的),下面列一个小例子:
_
地址:http://feedback.ebay.com/ws/eBayISAPI.dll?ViewFeedback2&ftab=AllFeedback&userid=paragad&iid=-1&de=off&items=25&interval=0&mPg=151
抓取评论区的:回复内容,购买人名字,购买时间
引用:HtmlAgilityPack库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
namespace AnaHtml
{
class Program
{
static void Main(string[] args)
{
HtmlWeb html = new HtmlWeb();
var content = from page in html.Load("http://feedback.ebay.com/ws/eBayISAPI.dll?ViewFeedback2&ftab=AllFeedback&userid=paragad&iid=-1&de=off&items=25&interval=0&mPg=151")<br /> //Skip(1)排除标题行 where((x,index)=>index%2==0)选取相应的内容行
.DocumentNode.SelectSingleNode("//table[@class='FbOuterYukon']").Elements("tr").Skip(1).Where((x, index) => index % 2 == 0)
let row = page
where row != null
select new
{
Content = row.ChildNodes[1].InnerText,<br /> //注意,任何时候的SelectSingleNode方法都是以整个document为前提的,个人觉得应该当前的节点为前担
Id =row.ChildNodes[2].SelectSingleNode(row.ChildNodes[2].XPath+"//div[1]//a[1]//span[1]").InnerHtml,
Retime = row.ChildNodes[3].InnerText
};
foreach (var item in content)
{
Console.WriteLine("\r\n Content:{0} Id={1} Time={2} ", item.Content, item.Id,item.Retime);
}
Console.Read();
}
}
}
整个结构清晰自然,利用Xpath的来进行选取相当方便,轻易就可以抓取内容。
附注:
一,正则相关
2.正则达人的博客
二,解析库:
**XPath简明介绍
** XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
下面列出了最有用的路径表达式:
nodename:选取此节点的所有子节点。
/:从根节点选取。
//:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.:选取当前节点。
..:选取当前节点的父节点。
例如有下面一段XML:
xmlversion=“1.0"encoding=“utf-8"?>
- 原文作者:大鱼
- 原文链接:https://brucedone.com/archives/271/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。