为了账号安全,请及时绑定邮箱和手机立即绑定

BeautifulSoup 保留一些文本,但删除标签的其余部分

BeautifulSoup 保留一些文本,但删除标签的其余部分

喵喔喔 2023-07-11 16:14:43
我正在使用一个从论坛抓取数据的机器人。我这里有这个可以使用:<description><![CDATA[ <p>This is a test post with a few emotes <img src="https://sjc5.discourse-cdn.com/try/images/emoji/twitter/grin.png?v=9" title=":grin:" class="emoji" alt=":grin:"> <img src="https://sjc5.discourse-cdn.com/try/images/emoji/twitter/heart.png?v=9" title=":heart:" class="emoji" alt=":heart:"></p> ]]></description>从此我想得到This is a test post with a few emotes :grin: :heart:我该怎么做呢?如果表情也位于文本中间,我也希望能够做到这一点。
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

from bs4 import BeautifulSoup, CData


txt = '''<description><![CDATA[ <p>This is a test post with a few emotes <img src="https://sjc5.discourse-cdn.com/try/images/emoji/twitter/grin.png?v=9" title=":grin:" class="emoji" alt=":grin:"> <img src="https://sjc5.discourse-cdn.com/try/images/emoji/twitter/heart.png?v=9" title=":heart:" class="emoji" alt=":heart:"></p> ]]></description>'''


# load main soup:

soup = BeautifulSoup(txt, 'html.parser')


# find CDATA inside <description>, make new soup

soup2 = BeautifulSoup(soup.find('description').find(text=lambda t: isinstance(t, CData)), 'html.parser')


# replace <img> with their alt=...

for img in soup2.select('img'):

    img.replace_with(img['alt'])


# print text

print(soup2.p.text)

印刷:


This is a test post with a few emotes :grin: :heart:


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信