近段时间在论坛上面兴起了一股正则之风,不论做什么都喜欢用正则

你在后台解析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")                          //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 = pagewhere row != nullselect new{Content = row.ChildNodes[1].InnerText,                              //注意,任何时候的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的来进行选取相当方便,轻易就可以抓取内容。

附注:

一,正则相关

1.30分钟搞定正则(了然正则的基础知识点)

2.正则达人的博客

3.正则工具RegexBug

二,解析库:

XPath简明介绍
 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
 下面列出了最有用的路径表达式:
 nodename:选取此节点的所有子节点。 
 /:从根节点选取。 
 //:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 
 .:选取当前节点。 
 ..:选取当前节点的父节点。
 例如有下面一段XML:

<?xml version="1.0" encoding="utf-8"?>

<Articles>

<Article>

<Title>在ASP.NET中使用Highcharts js图表</title>

<Url>http://zhoufoxcn.blog.51cto.com/792419/537324</Url>

<CreateAt type="en">2011-04-07</price>

</Article>

<Article>

<Title lang="eng">Log4Net使用详解(续)</title>

<Url>http://blog.csdn.net/zhoufoxcn/archive/2010/11/23/6029021.aspx</Url>

<CreateAt type="zh-cn">2010年11月23日</price>

</Article>

<Article>

<Title>J2ME开发的一般步骤</title>

<Url>http://blog.csdn.net/zhoufoxcn/archive/2011/06/12/6540223.aspx</Url>

<CreateAt type="zh-cn">2011年06月12日</price>

</Article>

<Article>

  1. <Title lang="eng">PowerDesign高级应用</title>
  2. <Url>http://zhoufoxcn.blog.51cto.com/792419/166415</Url>
  3. <CreateAt type="zh-cn">2007-09-08</price>
  4. </Article>
  5. </Articles>

针对上面的XML文件,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
 /Articles/Article[1]:选取属于Articles子元素的第一个Article元素。 
 /Articles/Article[last()]:选取属于Articles子元素的最后一个Article元素。 
 /Articles/Article[last()-1]:选取属于Articles子元素的倒数第二个Article元素。 
 /Articles/Article[position()<3]:选取最前面的两个属于 bookstore 元素的子元素的Article元素。 
 //title[@lang]:选取所有拥有名为lang的属性的title元素。 
 //CreateAt[@type='zh-cn']:选取所有CreateAt元素,且这些元素拥有值为zh-cn的type属性。 
 /Articles/Article[Order>2]:选取Articles元素的所有Article元素,且其中的Order元素的值须大于2。 
 /Articles/Article[Order<3]/Title:选取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值须小于3。
 
 HtmlAgilityPack API简明介绍
 在HtmlAgilityPack中常用到的类有HtmlDocument、HtmlNodeCollection、
HtmlNode和HtmlWeb等。
 其流程一般是先获取HTML,这个可以通过HtmlDocument的Load()或LoadHtml()来加载静态内容,或者也可以HtmlWeb的Get()或Load()方法来加载网络上的URL对应的HTML。
 得到了HtmlDocument的实例之后,就可以用HtmlDocument的DocumentNode属性,这是整个HTML文档的根节点,它本身也是一个HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多个HtmlNode的集合对象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回单个HtmlNode。

转自=>周公博客

转载于:https://www.cnblogs.com/codefish/archive/2013/05/18/3085681.html

别在迷恋正则表达式解析html了,好吗?相关推荐

  1. python爬虫正则表达式实例-python爬虫 正则表达式解析

    这篇文章主要介绍了python爬虫 正则表达式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 - re.I # 忽略大小写 - re.M # 多 ...

  2. java解析lrc_java中用正则表达式解析LRC文件

    跟着Mars老师 一起写android中的Mp3播放器 真是受益匪浅 再次感谢老师的无私奉献 不过其中问题也确实不少 感觉老师的代码重构做的不够 其中对LRC文件的解析也弄的比较马虎 今天特意花了一天 ...

  3. 【学习笔记】37、用正则表达式解析和提取数据

    用正则表达式解析和提取数据 正则表达式是一种非常好用的信息提取手段,它可以高效的从文本中提取所需信息. 1.findall()函数 基本语法格式: re.findall(匹配规则,原始文本) 例子:提 ...

  4. ipv6正则表达式 java,用正则表达式解析IPv4跟IPv6地址字符串

    用正则表达式解析IPv4和IPv6地址字符串 以下是经过我的.net C# 代码百般测试的,绝对经得住考验! IPv4[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9] ...

  5. js 取闭合标签正则_js正则表达式解析html标签中的内容

    接口获取的要解析的josn数据: { "item": { "nick": "科沃斯旗舰店", "price": &quo ...

  6. 在线正则表达式解析器和可视化工具

    在线正则表达式解析器和可视化工具 在线正则表达式可视化工具 可以很方便的解析出您正则表达式的执行逻辑,帮助您快速理解! http://lzltool.com/RegexVisualizer

  7. 正则表达式解析器的编写

    引言 我在正则表达式基础使用一文中介绍了正则表达式的基本使用,编写这篇文章的过程中,我的头脑中冒出了一个问题,正则表达式到底是如何匹配给定字符串的?当然,仅仅把其匹配机制当作是一种"魔法&q ...

  8. Python爬虫 教程: re正则表达式解析html页面

    正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式通常被用来匹配.检索.替换和 ...

  9. 解析单句sql_SqlParser 一个利用正则表达式解析单句SQL的类

    原SQL为select * from dual 解析后的SQL为 select * from dual 原SQL为SELECT * frOm dual 解析后的SQL为 select * from d ...

最新文章

  1. pip install faiss-gpu失败unable to execute ‘swig‘: No such file or directory
  2. ORG.SPRINGFRAMEWORK.HTTP.CONVERTER.HTTPMESSAGENOTREADABLEEXCEPTION: COULD NOT READ JSON: UNRECOGNIZE
  3. [转]npm生成的package.json文件中依赖项版本号前的波浪号(~)和插入符号(^)是啥意思?
  4. 【kafka】kafka Offset commit failed on partition The coordinator is not aware of this member
  5. 阿里云播放器组件 vue-aliplayer
  6. 使用谷歌云盘生成直接下载的url
  7. 涉密计算机用户密码操作规程,涉密计算机管理设置密码
  8. SHN-PEG2000-Pyrene,Pyrene-PEG2000-NHS
  9. Linux服务器下安装vsftpd,搭建文件服务器
  10. html 链接excel,如何把excel表格中的文本链接变成可点击打开的网址链接(超链接)?...
  11. YOLOv5改进--添加CBAM注意力机制
  12. RocEDU.阅读.写作《苏菲的世界》书摘(四)
  13. Failed to register product: 检索 COM 类工厂中 CLSID 为 {1ECCA34C-E88A-44E3-8D6A-8921BDE9E452} 的组件失败,原因是...
  14. 备受瞩目 | Conflux频频亮相2019上海区块链国际周
  15. 电影《一诺千金》剧照首度曝光系列一
  16. 基于对话框的MFC界面添加菜单栏
  17. 微信登录-6问题解决方案
  18. matlab波带片程序,Matlab编程快速实现振幅型菲涅尔波带片的设计
  19. liunx----putty--ssh--ppk---密文自动登陆
  20. 达梦(DM)数据库介绍。

热门文章

  1. mysql补丁如何安装_神技_如何快捷下载Oracle补丁的方法?!
  2. 【 FPGA 】数字系统设计方法的演变
  3. 轻松搞定Retrofit不同网络请求方式的请求参数配置,及常用注解使用
  4. SCCM2012工作组PC安装客户端问题
  5. C++用数组和链表分别实现Stack
  6. 3-unit5 ISCSI
  7. apache ab测试介绍
  8. 获取线程结束代码(Exit Code)
  9. 对Android GPS获取位置信息的新研究.
  10. pytroch一机多卡训练