从网页中提取 RSS feed






3.85/5 (6投票s)
2004 年 9 月 25 日
4分钟阅读

163455

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 control。
HtmlContent
控件将被添加到项目中。 - 将控件重命名为
CnnNews
。 - 运行 XPathDataExtractor 自定义属性编辑器。
- 定义命名 XPath 表达式:使用鼠标光标选择 HTML 链接,然后单击鼠标左键计算 XPath 表达式。将表达式更改为选择链接列表(例如,DIV[1]/DIV[position() != 7] /A[1])。
- 单击Add按钮。将命名表达式重命名为"ItemList"。
- 单击Exec按钮测试表达式并关闭 XPathDataExtractor 对话框。
- 导航到一个新闻文章。标记页面上的文本并创建控件(步骤 5)。
- 创建以下命名 XPath 表达式:
PubDate
、Content
和Title
。 - 将场景描述符 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 以及在更复杂的情况下的应用。