//需要引入的声明
using CefSharp;
using CefSharp.WinForms;
using System.Xml;
using System.Xml.XPath;
using HtmlAgilityPack;
一、获取HTML数据
可以使用webBrowser或CefSharp获取网络数据。浏览器实例化后可以选择是否在前台显示。获取的HTML将以字符串形式存储。
其中,CefSharp的初始化代码如下:
public ChromiumWebBrowser ThisWeb; //浏览器对象
public void InitializeChromium()
{
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
ThisWeb = new ChromiumWebBrowser("www.baidu.com"); //打开
ThisWeb.LifeSpanHandler = new OpenPageSelf();//禁止外部打开
this.panelWeb.Controls.Add(ThisWeb); //绑定前台控件,可不绑定
}
ThisWeb.Load(txtUrl.Text); //数据访问
string task1 = await ThisWeb.GetSourceAsync(); //获取HTML内容
二、数据转换
在获取HTML内容后,使用HtmlAgilityPack,将string型转换为HTML对象。
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); //HTML对象
doc.LoadHtml(task1);//将字符串转换成 HtmlDocument
三、使用XPath进行解析
doc.LoadHtml(task1);//加载HTML
HtmlAgilityPack.HtmlNodeCollection elem = doc.DocumentNode.SelectNodes(XPath公式);
Ps.使用SelectNodes仅能获取到结点,并不能使用其中的数据。若需选择结点中的元素,则需遍历elem集合后使用GetAttributeValue进行获取。
foreach (var item in elem)
{
if (txtElem.Text != "")
item.GetAttributeValue(txtElem.Text, "Null"); //参数:元素名,未找到的输出
else
item.OuterHtml.ToString(); //获取具体内容
}
四、关于XPath
1.Chrome插件
在Chrome中安装:XPath Helper。可以在浏览器中调出进行语句调试
按照元素逻辑层级编写XPath语句。XPath的规则如下:
符号 | 说明 | 示例 | 示例说明 |
/ | 表示从根节点开始选择 | /pets | 选择根节点pets |
表示节点和子节点之间的间隔符 | /pets/dog | 选择pets节点下的dog节点 | |
//xx | 表示从整个xml文档中查找,而不考虑当前节点位置 | //price | 选择文档中所有的price节点 |
. | 单个英文半角句点表示选择当前节点 | /pets/. | 选择pets节点 |
.. | 双点,表示选择父节点 | /pets/dog[0]/.. | 表示pets节点,也就是第一个dog节点的父节点 |
@xx | 表示选择属性 | //dog/@color | 表示选择所有dog节点的color属性集合 |
[…] | 中括号表示选择条件,括号内为条件 | //dog[@color=’white’] | 所有color为white的dog节点 |
//dog[/price<100] | 所有price字节点值小于100的dog节点 | ||
中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的 | //dog[1] | 第1个dog节点 | |
//dog[last()] | 最后一个dog节点,last()是xPath内置函数 | ||
| | 单竖杠表示合并节点结合 | //dog[@color=’white’] | //cat[@color=’white’] | color属性为white的dog节点和color属性为white的cat节点 |
* | 星号表示任何名字的节点或者属性 | //dog/* | 表示dog节点的所有子节点 |
//dog/@* | 表示dog节点的所有属性节点 |
效果如下: