You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup4提取XML中content:encoded内的img标签?

问题分析与解决方案

你遇到的核心问题是CDATA块的解析处理——XML里<content:encoded>节点的内容被包裹在<![CDATA[...]]>中,BeautifulSoup默认会把这部分内容当作纯文本,而不会将其解析为可搜索的HTML节点,所以直接调用data.find_all('img')自然返回空列表。

另外提个小细节:你原有代码里多次循环soup.find_all('item')完全没必要,一次循环就能处理所有字段,效率会更高。

具体解决步骤

1. 处理CDATA中的HTML内容

首先从<content:encoded>节点中取出CDATA包裹的文本内容,再把这段文本重新转换成一个BeautifulSoup对象,这样就能正常解析里面的HTML标签了。

2. 优化字段提取逻辑

把title、link、pubDate的提取合并到同一个循环里,避免重复遍历item节点。

修正后的完整代码

from bs4 import BeautifulSoup

# 假设你的XML内容已加载到xml_content变量中
soup = BeautifulSoup(xml_content, 'xml')  # 解析XML必须用'xml'解析器,处理命名空间

title = []
link = []
pubDate = []
img_list = []

for item in soup.find_all('item'):
    # 提取title
    t_node = item.find('title')
    if t_node:
        title.append(t_node.text.strip())
    
    # 提取link
    l_node = item.find('link')
    if l_node:
        link.append(l_node.text.strip())
    
    # 提取pubDate
    d_node = item.find('pubDate')
    if d_node:
        pubDate.append(d_node.text.strip())
    
    # 处理content:encoded中的img标签
    content_node = item.find('content:encoded')
    if content_node and content_node.string:
        # 将CDATA内的文本转为可解析的HTML对象
        content_soup = BeautifulSoup(content_node.string, 'html.parser')
        # 提取img标签的src属性(注意img是自闭合标签,没有文本内容)
        for img in content_soup.find_all('img'):
            img_src = img.get('src')
            if img_src:
                img_list.append(img_src)

# 验证结果
print("标题列表:", title)
print("链接列表:", link)
print("发布日期:", pubDate)
print("图片URL列表:", img_list)

关键细节说明

  • 解析器选择:解析XML时必须用'xml'解析器,否则无法正确识别content:这类XML命名空间前缀。
  • CDATA处理:content_node.string会自动去除<![CDATA[和]]>包裹,提取出内部的HTML文本,再用html.parser解析就能识别<img>标签。
  • img标签提取:你之前用img.text是错误的——<img>是自闭合标签,没有文本内容,我们需要的是它的src属性,所以用img.get('src')来获取图片URL。

内容的提问来源于stack exchange,提问作者Azeem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:43:50