如何从 rxjs 中的可观察对象数组中解析 html 元素

How do I parse html elements from an observable array of objects in rxjs

在 angular 8 中,我正在解析 wordpress rss 提要并使用其属性之一 'content' 构建新闻滚动条。使用来自 node.js.

的 rss-parser 将 rss 提要处理成 javascript 对象

我需要从段落 (p) 元素之间解析出一个 http link、一个图像和几个文本字符。我的问题是我需要的数据包含在 'content' 属性 中,我不知道编码或如何解析 link、图像和文本并将它们放入变量中我可以在可观察范围内使用。

使用 Angular 和 rxjs,我能够派生一个对象数组,其中包含每篇文章和我需要的 属性。 const http$ = this.api.rssSource$(); 来自获取提要的 angular api.service.ts 和 returns 可观察的。然后我使用以下代码将其映射到对象数组:

this.newsItems$ = http$ .pipe( map(res => Object.values(res['items']))); 我得到了这个包含 20 个项目的数组

(20) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]

上面数组中的每个对象如下所示:

{content: "<a href="https://example.com/"><img width="300" height="200" src="https://example.com/some-image-300x200.jpeg" alt="blah blah blah" /></a><p>A lot of text about something and then something else</p><br /><p>jabber jabber and more jabber</p>↵<p><a href="https://example.com/example.html/" rel="nofollow">...Read More About Blah And Jabber</a></p>↵}

在 angular 模板中使用 <div [innerHTML]="item.content"></div> 我可以使用图像和大量文本呈现 html。但是,它不是我想要的格式,需要缩短和重新排列。我只需要完整的 'a href="https://xxx..." '、'img src="http://xxx..." ' 和一个 'p xxxx /p'.

如何访问该对象,以便我可以进一步解析它以填充 newsLink、newsImg、shortDes 的变量?

如果你想做的是操作发射数组中的每个对象,你可以在 RxJS map 调用中添加一个数组 map 调用:

this.newsItems$ = http$.pipe(
  map(res => Object.values(res['items']).map(item => {
    // do item modification here
  }))
);

这将return 修改后的数组。或者,您可以拆分数组并将其作为单独的值发出,然后 RxJS map 对它们进行修改:

this.newsItems$ = http$.pipe(
  switchMap(items => from(items)),
  map(item => // manipulate individual items here)
);

至于实际解析本身,可以使用正则表达式和 match() 函数来实现:

arrayOfAnchorTags = item.content.match(/<\s*a[^>]*>(.*?)<\/\s*\s*a>/g);