如何从RSS的content:encoded中提取HTML元素?xmlstarlet使用遇阻
解决WordPress RSS解析的两个问题:转义HTML提取图片 & 缺失头图
一、修复content:encoded中HTML转义导致的解析错误
你的命令报错是因为content:encoded里的HTML被转义成了</>实体,直接传给xmlstarlet会被识别为纯文本而非XML节点。可以通过先解码实体,再用HTML模式解析解决:
# 提取content:encoded中指定类名的第一张图片URL IMAGE_URL=$(xmlstarlet sel -t -m "/rss/channel/item[$itemnum]" -v "content:encoded" --decode feed.xml | xmlstarlet html -q -t -v "//img[@class='size-medium wp-image-2821 alignright'][1]/@src")
--decode:让xmlstarlet把转义的HTML实体还原成真实的</>标签xmlstarlet html -q:用HTML模式解析(兼容WordPress可能存在的非严格HTML),-q静默忽略解析错误
二、解决RSS中缺失新闻头图的问题
默认WordPress RSS不会包含文章的特色图片(头图),需要手动添加代码到主题的functions.php文件,或者用插件实现:
方法1:在RSS内容中插入头图
添加以下代码,会把特色图片插入到RSS的摘要或内容开头:
function add_featured_image_to_rss($content) { global $post; if(has_post_thumbnail($post->ID)) { // 替换' medium'为你需要的图片尺寸,比如'large'/'full' $image_url = get_the_post_thumbnail_url($post->ID, 'medium'); $content = '<img src="' . esc_url($image_url) . '" class="rss-featured-image" />' . $content; } return $content; } // 给RSS摘要和内容都添加头图 add_filter('the_excerpt_rss', 'add_featured_image_to_rss'); add_filter('the_content_feed', 'add_featured_image_to_rss');
方法2:添加自定义RSS标签(更易提取)
如果想直接提取头图URL,可添加自定义标签到RSS的item节点中:
function add_rss_featured_image_tag() { global $post; if(has_post_thumbnail($post->ID)) { $image_url = get_the_post_thumbnail_url($post->ID, 'medium'); echo '<featured_image>' . esc_url($image_url) . '</featured_image>'; } } // 把自定义标签添加到RSS2.0的每个item里 add_action('rss2_item', 'add_rss_featured_image_tag');
之后用xmlstarlet直接提取这个标签即可,无需解析HTML:
FEATURED_IMAGE=$(xmlstarlet sel -t -m "/rss/channel/item[$itemnum]" -v "featured_image" feed.xml)
内容的提问来源于stack exchange,提问作者Photon
相关产品推荐
相关产品推荐

