抓取网页数据(节点集中前五个节点集的使用方法和使用解析)

优采云 发布时间: 2021-09-24 22:05

  抓取网页数据(节点集中前五个节点集的使用方法和使用解析)

  我刚刚学习了XPath路径表达式,它主要用于搜索XML文档中的节点。通过XPath表达式,我可以快速定位和访问XML文档中的节点位置。Html也是一种类似于XML的标记语言,但语法没有那么严格。在codeplex中,有一个开源项目htmlagilitypack,它提供了用XPath解析HTML文件的功能,下面是如何使用类库

  首先,让我们讨论XPath路径表达式

  XPath路径表达式

  用于选择XML文档中的节点或节点集

  1、术语:节点:7种类型:元素、属性、文本、命名空间、处理命令、注释、文档(根)节点

  2、节点关系:父节点、子节点、兄弟节点、祖先节点、后代节点

  3、路径表达式

  NodeName节点名称,选择此节点的所有子节点,例如:当前节点中的childnode子节点,不包括具有孙辈和孙辈以下的节点

  /从根节点中选择一个示例:/root/childnode/grandonnode

  //表示所有子代节点。例如://childnode所有名为childnode的子代节点

  。指示当前节点。示例:./childnode表示当前节点的childnode节点

  。。指示父节点。例如,…/nearnode表示父节点的nearnode子节点

  @选择属性/root/childnode/@ID来表示收录childnode的ID属性的所有节点集

  4、谓词

  谓词可以对节点集进行一些限制,以使选择更加准确

  /根/书本[1]节点集中的第一个节点

  /Root/book[last()]节点集中的最后一个节点

  /Root/book[position()-1]节点集中倒数第二个节点集

  /Root/book[position()35]/Title节点set book的price元素值大于35的Title节点集

  5、通配符:XPath路径中也支持通配符(*、@*、node()、text()

  例如:/书店/*

  //标题[@*]

  6、XPath轴

  定义相对于当前节点的节点集

  祖先节点

  属性所有属性节点

  子元素所有子元素

  子代所有子代节点(子代、子代…)

  在结束标记之后的所有节点之后,在开始标记之前的所有节点之前

  在同级节点之后,结束标记之后的所有同级节点

  标记前的所有同级节点

  命名空间当前命名空间的所有节点

  父节点

  自流节点

  用法:轴名称::节点测试[谓词]

  示例:ancester::Book

  child::text()

  7、操作员

  |合并两个节点集的示例:/root/book[1]|/root/book[3]

  +,-,*,开发,国防部

  =,!==

  或者,或者

   //删除注释,script,style

node.Descendants()

.Where(n => n.Name == "script" || n.Name == "style" || n.Name=="#comment")

.ToList().ForEach(n => n.Remove());

//遍历node节点的所有后代节点

foreach(var HtmlNode in node.Descendants())

{

}

  Htmlagilitypack类库用法

  1、首先,您需要获取HTML页面数据,这些数据可以通过webrequest类获得

   public static string GetHtmlStr(string url)

{

try

{

WebRequest rGet = WebRequest.Create(url);

WebResponse rSet = rGet.GetResponse();

Stream s = rSet.GetResponseStream();

StreamReader reader = new StreamReader(s, Encoding.UTF8);

return reader.ReadToEnd();

}

catch (WebException)

{

//连接失败

return null;

}

}

  2、通过htmldocument类加载HTML数据

   string htmlstr = GetHtmlStr("http://www.hao123.com");

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

doc.LoadHtml(htmlstr);

HtmlNode rootnode = doc.DocumentNode; //XPath路径表达式,这里表示选取所有span节点中的font最后一个子节点,其中span节点的class属性值为num

//根据网页的内容设置XPath路径表达式

string xpathstring = "//span[@class='num']/font[last()]";

HtmlNodeCollection aa = rootnode.SelectNodes(xpathstring); //所有找到的节点都是一个集合

if(aa != null)

{

string innertext = aa[0].InnerText;

string color = aa[0].GetAttributeValue("color", ""); //获取color属性,第二个参数为默认值

//其他属性大家自己尝试

}

  Htmldocument也可以通过htmlweb类获得

   HtmlWeb web = new HtmlWeb();

HtmlAgilityPack.HtmlDocument doc = web.Load(url);

HtmlNode rootnode = doc.DocumentNode;

  补编:

  多属性条件查询//div[@align='center'和@height='24']

  Class属性不存在//div[不(@Class)]

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线