Как преобразовать текст HTML тега `abbr` в текст в скобках в Python? - PullRequest
5 голосов
/ 23 сентября 2019

Мне нужно преобразовать сотни HTML-предложений, сгенерированных внешним источником, в читаемый текст, и у меня возник вопрос о преобразовании тега abbr.Ниже приведен пример:

from bs4 import BeautifulSoup
text = "<abbr title=\"World Health Organization\" style=\"color:blue\">WHO</abbr> is a specialized agency of the <abbr title=\"United Nations\" style=\"color:#CCCC00\">UN</abbr>."
print (BeautifulSoup(text).get_text())

Этот код возвращает «ВОЗ является специализированным учреждением ООН.» .Однако я хочу . «ВОЗ (Всемирная организация здравоохранения) - это специализированное учреждение ООН (ООН)». Есть ли способ сделать это?Может быть, другой модуль, а не BeautifulSoup?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Вы можете перебирать элементы в soup.contents:

from bs4 import BeautifulSoup as soup
text = "<abbr title=\"World Health Organization\" style=\"color:blue\">WHO</abbr> is a specialized agency of the <abbr title=\"United Nations\" style=\"color:#CCCC00\">UN</abbr>."
d = ''.join(str(i) if i.name is None else f'{i.text} ({i["title"]})' for i in soup(text, 'html.parser').contents)

Вывод:

'WHO (World Health Organization) is a specialized agency of the UN (United Nations).'
0 голосов
/ 23 сентября 2019

Вероятно, с одним из худших алгоритмов в истории алгоритмов:

import re
from bs4 import BeautifulSoup
text = "<abbr title=\"World Health Organization\" style=\"color:blue\">WHO</abbr> is a specialized agency of the <abbr title=\"United Nations\" style=\"color:#CCCC00\">UN</abbr>."
soup = BeautifulSoup(text, 'html.parser')
inside_abbrs = soup.find_all('abbr')

string_out = ''

for i in inside_abbrs: 
  s = BeautifulSoup(str(i), 'html.parser')
  t = s.find('abbr').attrs['title']
  split_soup = re.findall(r"[\w]+|[.,!?;]", soup.text)
  bind_caps = ''.join(re.findall(r'[A-Z]', t))

  for word in split_soup:
    if word == bind_caps:
      string_out += word + " (" + t + ") " 
      break
    else:
      string_out += word + " "

string_out = string_out.strip()
string_out += '.'
print(string_out)

Вывод

WHO (World Health Organization) WHO is a specialized agency of the UN (United Nations).
...