65.9K
CodeProject 正在变化。 阅读更多。
Home

从网页中提取 RSS feed

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.85/5 (6投票s)

2004 年 9 月 25 日

4分钟阅读

viewsIcon

163455

downloadIcon

1787

演示如何从网页提取 RSS 源。

引言

我喜欢 RSS 阅读器。它们为我节省了大量时间。如果我们能将任何网页数据转换为 RSS 格式,那岂不是很好?然后我们就可以以一种标准的方式查看银行记录、信用卡记录、在线商店促销、电子邮件订阅等。

不幸的是,提供 RSS/ATOM 源的网站并不多。在本文中,我将展示 RSS 提取是一项非常简单的任务,特别是如果使用了合适的技术。

如何提取

我们只考虑使用 HTML 或 DHTML 开发的网页。乍一看,这个任务似乎很简单:将 HTML 页面下载到本地并解析它们。但是,即使是简单的网站,编写代码也可能需要几个小时,而且很难让代码保持工作;网站的更改会破坏它。

可以使用以下方法从网页提取数据:“原始”HTTP、IE 自动化和 SWExplorerAutomation。

“原始”HTTP

HTTP 是一种“原始”方法。我们使用 WebRequest(.NET)将页面源下载到本地。然后可以通过 XPath 或正则表达式提取 RSS 数据。要使用 XPath,应使用 HTML Tidy 将页面源转换为 XML(XHTML)。

优点

  • 性能非常快。

缺点

  • 需要了解 TCP/IP、HTTP、HTTPS、Cookie 等。
  • 由于 HTML 不规范,HTML 到 XML 的转换并非总是有效。
  • 非常不稳定。即使是网站布局的微小更改也会导致提取失败。
  • 无法处理 JavaScript 创建的网页。
  • 耗时。

IE 自动化

该解决方案基于访问 HTML DOM。我们可以使用 Internet Explorer 自动化或宿主 Web 浏览器控件来访问 HTML DOM 数据模型。

优点

  • 可以处理 IE 中显示的任何网页。
  • 不需要了解 TCP/IP、HTTP、HTTPS、Cookie 等。

缺点

  • 网站布局的更改会导致提取失败。
  • 需要对 Web 浏览器事件、HTML DOM、COM 有良好的了解。
  • 速度不如 HTTP 方式。
  • 耗时。

SWExplorerAutomation

图 1. SWExplorerAutomation 类图。

SWExplorerAutomation 是一个将 Web 应用程序转换为可编程对象的框架:场景(页面)和控件。这些对象使用可视化设计器进行可视化定义,并可从任何 .NET 语言访问。

优点

  • 可以处理 IE 中显示的任何网页。
  • 不需要了解 TCP/IP、HTTP、HTTPS、Cookie 等。
  • 将数据提取与程序逻辑分离。
  • 有效处理错误条件。
  • 编写代码只需几分钟。

缺点

  • 速度不如 HTTP 方式。

SWExplorerAutomation 示例

为了说明 SWExplorerAutomation 如何用于从网页提取 RSS 源,我编写了一个示例应用程序,用于从 CNN 网站提取 RSS 源。我为 CNN 页面创建了以下定义(场景):[CnnNews][Sport][Money][Main]。每个场景都包含一个 HtmlContent 控件,用于从定义的页面位置提取数据。

首先,我们创建并初始化 ExplorerManager 实例。ExplorerManager 由 [cnn_rss.htp] 项目文件初始化,该文件是通过 SWExplorerAutomation 设计器可视创建的。ExplorerManager Connect() 函数运行 Internet Explorer 实例并连接到它。然后 ExplorerManager 将浏览器导航到 CNN 主页。

ExplorerManager explorerManager = new ExplorerManager();
explorerManager.Connect();
explorerManager.LoadProject(@"..\..\cnn_rss.htp");
explorerManager.Navigate("http://www.cnn.com/");
rssw.WriteChannel("CNN", "CNN News", scene.Descriptor.Url);

代码会等待直到为 CNN 主页定义的场景被激活。它使用 XPathDataExtractor 从网页中提取文章链接列表。

scene = explorerManager["CnnNews"];
if (!scene.WaitForActive(60000)) 
return ""; 
XmlNodeList nodeList = (HtmlContent)(scene["HtmlContent_0"])). 
XPathDataExtractor.Expressions["ItemList"].SelectNodes(); 
for ( int i = 0; i < nodeList.Count; i++) { 
     //…….. 
}

对于每个文章链接,会重复相同的操作:导航、等待、提取。

for ( int i = 0; i < nodeList.Count; i++) { 
  string link = nodeList[i].Attributes["href"].Value as String; 
  explorerManager.Navigate(link); 
  Scene[] scenes = explorerManager.WaitForActive( new 
        string[] {" Main ", "Money", "Sport"}, 20000); 
  if (scenes == null) 
    continue; 
  scene = scenes[0]; 
  XPathDataExtractor xe = 
    ((HtmlContent)(scene["HtmlContent_0"])).XPathDataExtractor; 
  string title = xe.Expressions["Title"].SelectNodes()[0].InnerText; 
  string pubDateStr = xe.Expressions["PubDate"].SelectNodes()[0].InnerText; 
  WriteRssItem(title, link, 
    xe.Expressions["PubDate"].SelectNodes()[0].InnerText, 
    xe.Expressions["Content"].SelectNodes()); 
  scene.Deactivate(); 
}

代码完全由元数据驱动,即使 CNN 网站设计发生变化,也无需更改代码。

使用 Visual Designer 创建 cnn_rss.htp

屏幕截图 1. SWExplorerAutomation Visual Designer

使用 SWDesigner 创建 cnn_rss.htp

  • Explorer菜单上,单击Run
  • 将 IE 导航到 http://www.cnn.com/
  • Scene Editor菜单上,单击Start
  • 使用鼠标右键显示 IE 上下文菜单。单击SceneEditor\Text Selection Mode
  • 标记 CNN 页面上的文本。从上下文菜单中单击SceneEditor\Select controlHtmlContent 控件将被添加到项目中。
  • 将控件重命名为 CnnNews
  • 运行 XPathDataExtractor 自定义属性编辑器。
  • 定义命名 XPath 表达式:使用鼠标光标选择 HTML 链接,然后单击鼠标左键计算 XPath 表达式。将表达式更改为选择链接列表(例如,DIV[1]/DIV[position() != 7] /A[1])。
  • 单击Add按钮。将命名表达式重命名为"ItemList"
  • 单击Exec按钮测试表达式并关闭 XPathDataExtractor 对话框。
  • 导航到一个新闻文章。标记页面上的文本并创建控件(步骤 5)。
  • 创建以下命名 XPath 表达式:PubDateContentTitle
  • 将场景描述符 URL 模式更改为正则表达式“http://www\.cnn\.com/2004(.*)”并更改标题模式为“CNN\.com\ -(.*)”
  • 对 Money 和 Sport 重复步骤 11-13。

使用 SWDesigner 查看 cnn_rss.htp

  • Project菜单上,单击Open
  • 选择“cnn_rss.htp”。
  • Scene Editor菜单上,单击Start
  • 选择 CnnNews 场景。在上下文菜单上,单击Navigate
  • 运行 XPathDataExtractor 自定义属性编辑器。
  • 对所有场景重复步骤 4-5。

使用代码

只需不要忘记注册 SWExplorerAutomation.dll。它是一个浏览器帮助对象,需要注册。

摘要

本文介绍了如何使用 SWExplorerAutomation 从网页提取 RSS 源。我花了不到 10 分钟就写完了这篇文章的示例代码并进行了测试。未来的文章将更详细地介绍 SWExplorerAutomation 以及在更复杂的情况下的应用。

© . All rights reserved.