Добавить несколько условий внутри однострочного цикла в Python - PullRequest
0 голосов
/ 06 января 2019

Я использую beautifulsoup, чтобы очистить сайт, получить все элементы p с классом text. Иногда внутри этого p существует элемент с классом emoji, который я хочу сохранить. Итак, я изначально сделал этот цикл:

for p in soup.find_all('p', {'class': 'text'}):
    emoji = p.select('emoji')
    ems = ""
    if emoji:
        for em in emoji:
            ems += (str(em['alt']))
    result.append([p.getText(), ems])

Я преобразовал это в однострочный цикл:

result = [[x.getText(), y['alt']] for x in soup.find_all("p", {"class": "text"}) for y in x.select('emoji')]

Проблема с моим однострочным циклом:

  • Сохраняет p там, где существует класс emoji только . Мне нужно сохранить все p, а когда emoji не существует, я хочу сохранить пустую строку, например ['lorem ipsun', ''] . Куда мне добавить это условие в однострочном цикле?

  • Если существует несколько emoji с, он сохраняет то же самое text n раз, n - количество смайликов, каждый раз с различным сингл эмодзи. Как я могу сохранить все смайлики, разделенные запятой? Пытался сделать ''.join(','+y['alt']) вместо y['alt'], но не изменил мой результат.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Взял ответ @ AniketNavlur и немного его изменил, в конце концов это сработало:

result = [[p.getText(), functools.reduce(lambda x, y: x + y, [str(em['alt']) for em in p.select('emoji')], '') ] for p in soup.find_all('p', {'class': 'text'})]

0 голосов
/ 06 января 2019

Попробуйте это:

import functools

result = [ [p.getText(), functools.reduce(lambda x, y: x + y, [ str(em['alt']) for em in p.select('emoji')])] for p in soup.find_all('p', {'class': 'text'})]
...