基于云开发的小程序同步公众号文章并用towxml解析html内容(三)

微信小程序同步微信公众号文章已在前文实现:

https://blog.csdn.net/haitaoxiaodian/article/details/90912387

本文中主要实现功能是点击文章列表的一条,然后在另一页展示详细内容,由于请求的文章数据是html格式的,但由于小程序的一些特殊性,无法直接渲染html,因此类似wxParse的开源组件诞生了,无非是穷举标签进行替换,差异在于覆盖是否全面和是否更加高效。本文选自towxml,首先解析比较全面,样式也比较完美,对于公众号花哨的排版基本支持。

如何使用towxml

使用towxml还是比较简单的,网上有很多教程,这里简单说下基于服务端解析、小程序端直接渲染的方式:

首先下载源码,将towxml整个文件夹放到小程序的根目录下。

本次开发点击文章列表进入详情页传入的参数是title,

 getDetial(e){
    let id = e.currentTarget.id;
    wx.navigateTo({
      url: '../detial/detial?id='+id
    });
  }

然后在wxml中引入towxml模板文件:

<!--引入towxml模版入口文件,并使用模版-->
<import src="../../towxml/entry.wxml"/>
<template is="entry" data="{{...article}}"/>

逻辑层实现方式,根据传入的文章标题从云数据库中查询内容,然后用towxml解析成wxml格式文本:

onLoad: function (options) {
    const wxml = new Towxml();
    const db = wx.cloud.database();
    let that = this;
    db.collection('content').where({
      title:options.id
    }).get({
     success:function(res){
       let wen = res.data[0].content;
       wen = wen.replace(/data-src/g, "src");
       wen = wen.replace(/<ul class="code-snippet__line-index code-snippet__js".*?<\/ul>/g, '');
       let ret = wxml.toJson(wen,'html');
       that.setData({
         article:ret
       })
     }
   })
  }

整体解析效果还是不错的

使用towxml遇到的坑

首先遇到的问题是图片展示不了,如下截图

在查看解析后的文本json后发现,imgsrc属性是空的。

再回过头看公众号文章原始的html的时候发现,原始的img标签下的属性都是data-src开始的,难怪无法解析。

<img class="rich_pages" data-ratio="0.4909560723514212" data-s="300,640" data-src="https://mmbiz.qpic.cn/mmbiz_pn

然后发现公众号自带的代码片段样式解析之后也存在问题,截图如下,在代码上方多了很多点,是towxml在解析代码序号的时候生成ulli标签了,但在样式上没有做好处理。

比较简单的处理方式是解析前将img的data-src属性替换成src,把列表标签<ul><li><li><li></ul>去除掉

 wen = wen.replace(/data-src/g, "src");
 wen = wen.replace(/<ul class="code-snippet__line-index code-snippet__js".*?<\/ul>/g, '');

更多精彩内容,敬请关注我的微信公众号:linux白帽子,已开发完成的小程序

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
插件地址:https://github.com/kevenfeng/html-to-wxml如果前端技术比较牛,可以直接看github上面的demo。可以更好的理解用法。使用方法:1.引用插件var R_htmlToWxml = require(‘../../util/htmlToWxml.js’);//引入公共方法2.将html内容转成json数据R_htmlToWxml.html2json(“html内容”);转换后的json格式类型大概如下:3.吐到页面中显示<block wx:for="{{content}}"  wx:for-index="idy"  wx:for-item="cellData">         <block  wx:if="{{cellData.type == 'view'}}">             <view class="p">                 <block  wx:for="{{cellData.child}}" wx:key="text">                     <block  wx:if="{{item.type == 'a'}}">                         <text class="a" data-seccode="{{item.attr['data-seccode']}}" data-secname="{{item.attr['data-secname']}}" bindtap="stockClick">{{item.text}}</text>                     </block>                     <block  wx:else>                         <text>{{item.text}}</text>                     </block>                 </block>             </view>         </block>         <block wx:if="{{cellData.type == 'img'}}">             <image class="img" data-index="{{idy}}" style="height: {{cellData.attr.height?cellData.attr.height:0}}px"  mode="aspectFit" src="{{cellData.attr.src}}" bindload="imageLoad"></image>         </block>     </block>demo效果:由于小程序图片的高度没法自适应,需要给图片设置高度,所以需要在图片加载完以后,获取图片高度,等比算出显示图片高度,赋值给对应图片通常我们抓取的内容html页面,特别是像资讯这一类的,如果在小程序里面显示文章内容,此插件提供了一种解决方案,希望对大家有用。在客户端中用native显示html页面体验上面没有native的好,htmlToWxml插件给客户端中用native的方式显示html内容提供了一种解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值