скрести смайлики с текстом в красивый суп - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь почистить страницу, используя python и красивый суп bs4

Я хочу сохранить текст в элементе <p> на странице вместе с emojis в этом тексте.

Первая попытка была:

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>

Итак, я хочу сделать следующее:

  • getText () для p с классом text
  • Но также получить alt для img с class=emoji

И сохранить текст и смайлики в одном предложении.

Есть ли способ сделать это?

Любая помощь будетоценены.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

, если 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? ?!']
0 голосов
/ 26 декабря 2018

Как насчет следующего, возвращая наборы целевых данных для каждого 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)))

Результат:

[('I love the night!', '?'), ('I love the night!', '?')]
...