最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~

于是到https://www.nuget.org/packages/ScrapySharp去看看,

看到这句下载提示:To install ScrapySharp, run the following command in the Package Manager Console

PM> Install-Package ScrapySharp

接下去我就去找package manager console,(http://docs.nuget.org/docs/start-here/using-the-package-manager-console

操作说明:From the Tools menu, select Library Package Manager and then click Package Manager Console.

发现还没装~@_@!!

那么就去装一下插件吧!阅读了这篇博文http://www.cnblogs.com/baiyu/archive/2011/09/07/2170028.html

一、 安装Nuget

  1. Visual studio 2012-> Tool-> Extension Manager。

  2. 选择Online Gallery,在右上角的搜索中输入Nuget,之后按提示安装即可。

  3. 安装之后菜单View-> Other windows中会出现Package Manager Console, 这是一个集成到VS中的控制台工具。

注意:在选择ScrapySharp的版本的时候也要考虑htmlAgilityPack的版本 

附:scrapySharp官网链接:https://www.nuget.org/packages/ScrapySharp

于是,继续操作Tools->Library Package Manager->Package Manager Console

PM> Install-Package HtmlAgilityPack
正在安装“HtmlAgilityPack 1.4.”。
已成功安装“HtmlAgilityPack 1.4.”。
正在将“HtmlAgilityPack 1.4.”添加到 WindowsFormsDemo0320。
已成功将“HtmlAgilityPack 1.4.”添加到 WindowsFormsDemo0320。
PM> Install-Package ScrapySharp
正在尝试解析依赖项“HtmlAgilityPack (≥ 1.4.)”。
正在安装“ScrapySharp 2.2.”。
已成功安装“ScrapySharp 2.2.”。
正在将“ScrapySharp 2.2.”添加到 WindowsFormsDemo0320。
已成功将“ScrapySharp 2.2.”添加到 WindowsFormsDemo0320。

接下来开始进行抓取,

原始网页是网易一新闻网页:http://news.163.com/14/0413/18/9PNVIBV000014JB6.html

下面实现的效果是,抓取title标签的内容和正文内容(也就是<div id="endText">…(捕捉<p></p>中间的内容)…</div>)

捕捉title的时候需要注意,有时候一个网页不只一对title标签!!

但是,其实网易新闻页面显示的标题存储的标签<h1 id="hltitle">……</h1>

所以提取标题的核心代码为

String title = doc.DocumentNode.SelectSingleNode("//h1[@id='h1title']").InnerText;

捕捉正文内容的核心代码:

html.CssSelect("p").CssSelectAncestors("div#endText");

下面看下该新闻页面正文部分的html代码:

<div id="endText"></p><p>人民网兰州4月13日电 兰州市今天下午召开新闻发布会,初步查明了导致自流沟内水体苯超标的原因。根据环保专家现场初步分析判断,周边地下含油污水是引起自流沟内水体苯超标的直接原因。</p><p>根据目前的调查情况初步判定,自流沟周边地下含油污水形成的原因有三点:一是原兰化公司原料动力厂原油蒸馏车间R205A#渣油罐曾于1987年12月28日8时50分发生物理爆破事故,罐体破裂造成90立方渣油泻出,其中有34吨渣油跑料未能回收,渗入地下;二是原兰化公司原料动力厂原油蒸馏车间泵B-113出口总管曾于2002年4月3日发生开裂着火,泄漏的渣油及救火过程中产生的大量消防污水渗入地下。</p><p>另据中新网兰州4月13日电&nbsp; 兰州市“4·11”局部自来水苯指标超标事故应急处置领导小组副组长郑志强13日说,调查组从11日下午3时开始展开调查工作,采取开挖深坑的方法,查找到了导致水体苯超标的方位。根据环保专家现场初步分析判断,周边地下含油污水是引起自流沟内水体苯超标的直接原因。</p><p>兰州官方通报称,根据目前的调查情况初步判定,自流沟周边地下含油污水的形成原因有两个:</p><p>一是原兰化公司原料动力厂原油蒸馏车间R205A#渣油罐(该址原为兰化公司原料动力厂250万吨/年炼油装置,该装置建于1982年,2003年停用,2006年拆除。拆除后,在原址建成现有的40万吨/年芳烃抽提装置,罐区设计分别储存馏份油、轻油、渣油),曾于1987年12月28日8时50分发生物理爆破事故,罐体破裂造成90立方渣油泄出,其中有34吨渣油跑料未能回收,渗入地下。</p><p><!-- AD200x300_2 -->
<div class="gg200x300">
<iframe src="http://g.163.com/r?site=netease&affiliate=news&cat=article&type=logo300x250&location=13" width="300" height="250" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"> </iframe>
</div><p>二是原兰化公司原料动力厂原油蒸馏车间泵B—113出口总管曾于2002年4月3日发生开裂着火,泄漏的渣油(具体数量当时未统计)及救火过程中产生的大量消防污水渗入地下。</p><p>郑志强说,目前兰州石化现有生产装置及罐区运行正常,未发现物料及产品泄漏现象。生产区域内雨排井、化污系统水封井未发现物料泄漏现象,消防井内发现有少量飘油。</p><p>事故调查组下一步调查工作的重点是,对从开挖深坑中提取的含油废水组份进行化验,进一步从技术层面核实地下含油污水与自流沟内苯超标水体的关联性。同时,对4号、3号自流沟内的具体泄漏点位进行实地勘查核实,并对造成局部自来水苯超标事件的相关责任单位和责任人进行进一步的调查取证。(完)</p>
<div class="ep-source cDGray">
<span class="left"><a href="http://news.163.com/"><img src="http://img1.cache.netease.com/cnews/css13/img/end_news.png" alt="netease" width="13" height="12" class="icon"></a> 本文来源:人民网 作者:高翔、银燕、苗亮军</span>
<span class="ep-editor">责任编辑:NN102</span>
</div>
</div>

下面贴一下实现的核心代码(但是编码处理部分代码没有贴出)

添加 :using ScrapySharp.Extensions;

namespace HtmlAgilityDemo
{
class Program
{
static void Main(string[] args)
{
var uri = new Uri("http://news.163.com/14/0413/18/9PNVIBV000014JB6.html");
var browser1 = new ScrapingBrowser();
var html1 = browser1.DownloadString(uri);
var doc = new HtmlDocument();
doc.LoadHtml(html1);
var html = doc.DocumentNode; var title = html.CssSelect("title");
foreach (var htmlNode in title)
{
Console.WriteLine(htmlNode.InnerText);
} var ps = html.CssSelect("p").CssSelectAncestors("div#endText");
foreach (var htmlNode in ps)
{
Console.WriteLine(htmlNode.InnerHtml);
}
}
}
}

运行后输出:

兰州官方公布自流沟周边地下含油污水形成原因_网易新闻中心

人民网兰州4月13日电 兰州市今天下午召开新闻发布会,初步查明了导致自流沟内水体苯超标的原因。根据环保专家现场初步分析判断,周边地下含油污水是引起自流沟内水体苯超标的直接原因。根据目前的调查情况初步判定,自流沟周边地下含油污水形成的原因有三点:一是原兰化公司原料动力厂原油蒸馏车间R205A#渣油罐曾于1987年12月28日8时50分发生物理爆破事故,罐体破裂造成90立方渣油泻出,其中有34吨渣油跑料未能回收,渗入地下;二是原兰化公司原料动力厂原油蒸馏车间泵B-113出口总管曾于2002年4月3日发生开裂着火,泄漏的渣油及救火过程中产生的大量消防污水渗入地下。另据中新网兰州4月13日电&nbsp; 兰州市“·”局部自来水苯指标超标事故应急处置领导小组副组长郑志强13日说,调查组从11日下午3时开始展开调查工作,采取开挖深坑的方法,查找到了导致水体苯超标的方位。根据环保专家现场初步分析判断,周边地下含油污水是引起自流沟内水体苯超标的直接原因。兰州官方通报称,根据目前的调查情况初步判定,自流沟周边地下含油污水的形成原因有两个:一是原兰化公司原料动力厂原油蒸馏车间R205A#渣油罐(该址原为兰化公司原料动力厂250万吨/年炼油装置,该装置建于1982年,2003年停用,2006年拆除。拆除后,在原址建成现有的40万吨/年芳烃抽提装置,罐区设计分别储存馏份油、轻油、渣油),曾于1987年12月28日8时50分发生物理爆破事故,罐体破裂造成90立方渣油泄出,其中有34吨渣油跑料未能回收,渗入地下。<!-- AD200x300_2 --> 二是原兰化公司原料动力厂原油蒸馏车间泵B—113出口总管曾于2002年4月3日发生开裂着火,泄漏的渣油(具体数量当时未统计)及救火过程中产生的大量消防污水渗入地下。郑志强说,目前兰州石化现有生产装置及罐区运行正常,未发现物料及产品泄漏现象。生产区域内雨排井、化污系统水封井未发现物料泄漏现象,消防井内发现有少量飘油。事故调查组下一步调查工作的重点是,对从开挖深坑中提取的含油废水组份进行化验,进一步从技术层面核实地下含油污水与自流沟内苯超标水体的关联性。同时,对4号、3号自流沟内的具体泄漏点位进行实地勘查核实,并对造成局部自来水苯超标事件的相关责任单位和责任人进行进一步的调查取证。(完)                                                                                                     本文来源:人民网  作者:高翔、银燕、苗亮军
责任编辑:NN102

然后看下输出,发现出现残留【<!-- AD200x300_2 --> 】

部分注释代码未被清除,那么处理一下,

foreach (HtmlNode nodeScripte in node.Descendants("script").ToList())
{
nodeScripte.Remove();
}
foreach (HtmlNode nodeStyle in node.Descendants("style").ToList())
{
nodeStyle.Remove();
}
foreach (HtmlNode nodeComment in node.Descendants("//comment()").ToList())
{
nodeComment.Remove();
}

发现嵌套在其中的注释标签用上面的方法无法清除干净。

那么采用下面方法,

foreach(var script in doc.DocumentNode.Descendants("script").ToArray())
{
script.Remove();
}
foreach(var style in doc.DocumentNode.Descendants("style").ToArray())
{
style.Remove();
}
foreach(var comment in doc.DocumentNode.SelectNodes("//comment()").ToArray())
{
comment.Remove();
}

运行后发现,已经清除干净。

把所有的script、style标签从dom树中去掉(为了解决迭代器在工作时不能从集合中Remove元素的问题,使用ToArray()转换为数组再遍历)。

HtmlAgilityPack是使用XPath语法,"//comment()"在XPath中表示“所有注释节点”。

【补充】获取html中meta标签中的content的内容

一些相关的语句:

1、获取网页title:doc.DocumentNode.SelectSingleNode("//title").InnerText;

  解释:XPath中“//title”表示所有title节点。SelectSingleNode用于获取满足条件的唯一的节点。

2、获取所有的超链接:doc.DocumentNode.Descendants("a")

3、获取name为kw的input,也就是相当于getElementsByName():

var kwBox = doc.DocumentNode.SelectSingleNode("//input[@name='kw']");

  解释:"//input[@name='kw']"也是XPath的语法,表示:name属性等于kw的input标签。

4、其他:

var divs = html.CssSelect("div");  //all div elements

var nodes = html.CssSelect("div.content"); //all div elements with css class ‘content’

var nodes = html.CssSelect("div.widget.monthlist"); //all div elements with the both css class

var nodes = html.CssSelect("#postPaging"); //all HTML elements with the id postPaging

var nodes = html.CssSelect("div#postPaging.testClass"); // all HTML elements with the id postPaging and css class testClass

var nodes = html.CssSelect("div.content > p.para"); //p elements who are direct children of div elements with css class ‘content’

var nodes = html.CssSelect("input[type=text].login"); // textbox with css class login

We can also select ancestors of elements:

var nodes = html.CssSelect("p.para").CssSelectAncestors("div.content > div.widget");

参考链接:

http://www.cnblogs.com/rupeng/archive/2012/02/07/2342012.html

http://www.cnblogs.com/cappuccino/p/3403495.html

http://www.cnblogs.com/dc-lancer/archive/2013/03/27/2985163.html

http://www.cnblogs.com/sswwsw/archive/2012/12/06/2805097.html

http://www.cnblogs.com/linfei721/archive/2013/05/08/3066697.html

http://www.cnblogs.com/cxlings/archive/2013/05/31/3110858.html

爬虫技术 -- 进阶学习(十)网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)的更多相关文章

  1. 网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp

    最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/Scrapy ...

  2. 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)

    转自原文 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp) 最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决 ...

  3. 爬虫技术 -- 进阶学习(十一)【补充】获取html中meta标签中的content的内容

    上一篇网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp中提及了很多如何快速抓取html中的文本的语句, 但是meta标签中的content内容的抓取,没有提及到! ...

  4. 爬虫技术 -- 进阶学习(九)使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)

    菜鸟HtmlAgilityPack初体验...弱弱的代码... Html Agility Pack是一个开源项目,为网页提供了标准的DOM API和XPath导航.使用WebBrowser和HttpW ...

  5. 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码)

    这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string&g ...

  6. python 页面信息抓取

    1. 特点 在python 解析html这篇文章中已经做了初步的介绍,接下来再坐进一步的说明.python抓取页面信息有下面两个特点: 依赖于HTML的架构. 微小的变化可能会导致抓取失败,这取决于你 ...

  7. 爬虫技术 -- 进阶学习(八)模拟简单浏览器(附c#代码)

    由于最近在做毕业设计,需要用到一些简单的浏览器功能,于是学习了一下,顺便写篇博客~~大牛请勿喷,菜鸟练练手~ 实现界面如下:(简单朴素版@_@||) button_go实现如下: private vo ...

  8. Python学习之静态页面数据抓取

    1 页面信息抓取 定义getPage函数,根据传入的页码get到整个页面的html内容 getContent函数,通过正则匹配把页面中的表格部分的html内容取出 最后定义getData函数,同样是通 ...

  9. scrapy爬虫学习系列五:图片的抓取和下载

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

随机推荐

  1. 从I/O复用谈epoll为什么高效

    上一篇文章中,谈了一些网络编程的基本概念.在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll 很多人提到网络就说epoll,认为epoll效率是最高的.单纯的这么认为 ...

  2. hadoop 2.7.3本地环境运行官方wordcount

    hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...

  3. vs2010静态链接MFC库报链接错误

    由于需要将MFC程序在其它电脑上运行,所以需要将动态链接的MFC改成静态链接,本以为很简单,没想到链接的时候出现下面的链接错误: uafxcw.lib(afxmem.obj) : error LNK2 ...

  4. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

  5. peer not authenticated的终极解决方案

    一.前述 使用httpclient发起https请求时,可能会遇到如下异常: javax.net.ssl.SSLPeerUnverifiedException: peer not authentica ...

  6. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  7. C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置

    用于永久化对象,什么程序都行,依赖NewtonSoft.用于json序列化和反序列化. using Newtonsoft.Json; using System; using System.Collec ...

  8. OSGi规范的C#实现开源

    这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...

  9. web服务器集群

    概述 集群和分布式都是从集中式进化而来的.分布式和集群会相互合作的,同时的集群和分布式.在这里重点说说集群 集群是什么? 集群能提高单位时间内处理的任务数量,提升服务器性能 有多台服务器去处理任务,但 ...

  10. CSS三个定位——常规、浮动、绝对定位

    .dage { width: 868px; background: #5B8C75; border: 10px solid #A08C5A; margin-top: -125px; margin-le ...