抓取网页数据(节点集中前五个节点集的使用方法和使用解析)
优采云 发布时间: 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)]