用美丽的汤中的文字刮掉表情符号

时间:2018-12-26 20:03:10

标签: python beautifulsoup emoji

我正在尝试使用python和漂亮的汤bs4

抓取页面

我想将文本保留在页面的<p>元素中,并将表情符号保留在此文本中。

第一次尝试是:

import urllib
import urllib.request
from bs4 import BeautifulSoup

urlobject = urllib.request.urlopen("https://example.com")

soup = BeautifulSoup(urlobject, "lxml")

result= list(map(lambda e: e.getText(), soup.find_all("p", {"class": "text"})))

但这不包括表情符号。然后,我尝试删除.getText()并保留:

result= list(map(lambda e: e, soup.find_all("p", {"class": "text"})))

这让我意识到这个网站中的表情符号位于alt标签的img中:

<p class="text">I love the night<img alt="" class="emoji" src="etc"/><span>!</span></p>

所以我想做的是:

  • p的{​​{1}}的getText()
  • 但也可以通过textalt获得img

并将文本和表情符号保留为一个句子。

有什么办法吗?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

接下来如何为每个int f(int a) { int []res = {a, 1, a+1, 0}; return res[a % 4]; } int getXor(int a, int b) { return f(b) ^ f(a); } 返回目标数据的元组?我只是两次将您的示例p元素用作此测试的输入:

p

结果:

from bs4 import BeautifulSoup

s = """
<p class="text">I love the night<img alt="" class="emoji" src="etc"/><span>!</span></p>
<p class="text">I love the night<img alt="" class="emoji" src="etc"/><span>!</span></p>
"""

soup = BeautifulSoup(s, 'lxml')

elements = soup.find_all('p', {'class': 'text'})
print(list(map(lambda e: (e.getText(), e.find('img', {'class': 'emoji'})['alt']), elements)))

答案 1 :(得分:1)

如果img.emoji是可选的,则可以在下面尝试,它将保留表情符号位置

urlobject = '''<p class="text">I love the night<img alt="" class="emoji" src="etc"/><span>!</span></p>
<p class="text">I love the day<span>!</span></p>
<p class="text">I love the music<img alt="" class="emoji" src="etc"/> <img alt="" class="emoji" src="etc"/><span>!</span></p>
'''

result = []
for p in soup.find_all('p', {'class': 'text'}):
    emoji = p.select('img.emoji')
    if emoji:
        for em in emoji:
            index = p.contents.index(em)
            p.contents[index].replace_with(em['alt'])
    result.append(p.getText())

print(result)

结果:

['I love the night!', 'I love the day!', 'I love the music !']