gpt4 book ai didi

javascript - 从 RSS 提要中提取 XML 元素值

转载 作者:行者123 更新时间:2023-11-30 17:10:46 25 4
gpt4 key购买 nike

我有一个 RSS 提要,我需要从中提取最新的 pubDate 元素以进行测试。最好的方法是什么?

RSS 订阅链接:https://secure.hyper-reach.com/rss/310085

示例 XML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="https://secure.hyper-reach.com/rss/310085" rel="self" type="application/rss+xml" />
<link>https://secure.hyper-reach.com/rss/310085</link>
<title>Hyper-Reach Automated Test Account alerts feed "Automated RSS Test"</title>
<description>Constant feed of alerts from Automated Test Account via hyper-reach.com</description>
<lastBuildDate>Fri, 21 Nov 2014 00:56:15 -0500</lastBuildDate>
<language>null</language>
<ttl>5</ttl>
<item>
<title>Alert (2014-11-21)</title>
<pubDate>Fri, 21 Nov 2014 00:56:15 -0500</pubDate>
<description>This is a test message.</description>
<link>https://secure.hyper-reach.com/servlet/getprompt?prompt_id=122967&amp;ver=0&amp;format=34&amp;nologin=1</link>
<guid isPermaLink="false">https://secure.hyper-reach.com/rss/item/257029</guid>
</item>
<item>...</item>
<item>...</item>
</channel>
</rss>

我在做什么:

checkRSSFeed = function() {
//first I navigate to a certain page in my website
var href = '';

casper.then(function() {
this.test.assertExists(x('//a[contains(@href, "SUBSTRING OF URL")]'), 'the element exists');
href = casper.getElementAttribute(x('//a[contains(@href, "SUBSTRING OF URL")]'), 'href');
}).then(function() {
this.open(href);
}).then(function() {
this.echo(this.getCurrentUrl());

var pubDate = '';
this.getPageContent();
pubDate = this._utils_.getElementByXPath('.//pubDate');
});
};

我得到的错误是

uncaughtError: TypeError: 'undefined' is not an object (evaluating 'this._utils_.getElementByXPath')

最佳答案

要检索 pubDate 内容,您可以使用 casper.fetchText函数,但它有一个缺点,它将所有文本节点连接成一个字符串:

casper.echo(casper.fetchText("pubDate"));

会打印

Fri, 21 Nov 2014 00:56:15 -0500Fri, 21 Nov 2014 00:47:34 -0500Fri, 21 Nov 2014 00:45:36 -0500

要实际单独检索文本,您可以使用 casper.getElementsInfo它适用于多个元素并提供 text 属性。之后的简单映射会生成一个数组,您可以在之后对其进行处理:

var pubDates = casper.getElementsInfo("pubDate").map(function(elementInfo){
return elementInfo.text; // or even `return new Date(elementInfo.text)`
});

但由于您只想要最新的,并且 RSS 提要按最新到最旧的顺序排序,您可以简单地使用第一个(注意 getElementInfo 中缺少 s ):

var pubDate = casper.getElementInfo("pubDate").text;

如果您在页面上下文中执行此操作,那么您之前的方法会奏效。 clientutils 模块只能在页面上下文中访问(在 casper.evaluate 内)。

var pubDate = this.evaluate(function(){
return __utils__.getElementByXPath('//pubDate').innerText;
});

请注意,__utils__ 两边都有两个下划线。此外,您不能将 DOM 元素从页面上下文传递到 casper 上下文,但您可以传递字符串和其他原始对象。因此,我返回了 DOM 元素的 innerText 属性。 documentation是这样说的:

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

关于javascript - 从 RSS 提要中提取 XML 元素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com