Как я могу удалить тег HTML в Python из файла HTML? - PullRequest
0 голосов
/ 25 октября 2018

Сводка: Какую строку регулярного выражения я бы использовал для удаления тегов в документе HTML?Хотя это может быть дубликатом предыдущего ответа: Как удалить только HTML-теги в строке? и Удалить HTML-теги в строке , я пока не могу полностью программировать на этих языкахВот почему я задаю вопрос.

Я выполняю Python Exercise от Google: https://developers.google.com/edu/python/exercises/baby-names он требует двух разборов HTML-данных с использованием регулярных выражений (HTML структурирован, поэтому его проще).У меня возникли проблемы при удалении тегов, окружающих данные:

   def extract_names(filename):
  """
  Given a file name for baby.html, returns a list starting with the year string
  followed by the name-rank strings in alphabetical order.
  ['2006', 'Aaliyah 91', Aaron 57', 'Abagail 895', ' ...]
  """
  # +++your code here+++
  #open and read file
  file = open(filename,'r')
  HTML = file.read()
  #html file
  #print(HTML)

  #extract date
  date = re.search(r'(Popularity in )([\d]+)',HTML)
  print('Date: ',date.group(2))

  #find rank and name remove html tags
  ranking_tags = re.findall(r'<td>[\d]</td>',HTML)
  rankings = []
  name_tags = re.findall(r'<td>[a-z]</td>',HTML,re.IGNORECASE)
  names = []

  for value in ranking_tags:
      rankings.append(re.sub('[<td></td>]','',value))

  for value in name_tags:
    names.append(re.sub('[<td></td>]','',value))
  print(rankings)
  print(names)

В настоящее время мое регулярное выражение не заменяет теги, поскольку они ошибочны.Я уже пытался научить себя, как убрать метки, но безрезультатно: http://www.cbs.dtu.dk/courses/27610/regular-expressions-cheat-sheet-v2.pdf и https://www.tutorialspoint.com/python/python_reg_expressions.htm, а также посмотреть на другие достопримечательности, прежде чем писать это.

Любые предложения будут очень полезныоценили.

1 Ответ

0 голосов
/ 08 ноября 2018

Если regex не требуется и для выполнения работы вы можете проверить существующие реализации.

Django's strip_tags:

https://github.com/django/django/blob/master/django/utils/html.py#L183

def _strip_once(value):
    """
    Internal tag stripping utility used by strip_tags.
    """
    s = MLStripper()
    s.feed(value)
    s.close()
    return s.get_data()


@keep_lazy_text
def strip_tags(value):
    """Return the given HTML with all tags stripped."""
    # Note: in typical case this loop executes _strip_once once. Loop condition
    # is redundant, but helps to reduce number of executions of _strip_once.
    value = str(value)
    while '<' in value and '>' in value:
        new_value = _strip_once(value)
        if len(new_value) >= len(value):
            # _strip_once was not able to detect more tags
            break
        value = new_value
    return value

Вы можете изменить эту реализацию.

Стандартная библиотека Python и ее xml модуль

https://docs.python.org/3/library/xml.etree.elementtree.html

Содержит примеры того, как правильно ее использовать.

Использование lxml упаковка

https://lxml.de/api/lxml.etree-module.html#strip_tags

Пример использования:

strip_tags(some_element,
    'simpletagname',             # non-namespaced tag
    '{http://some/ns}tagname',   # namespaced tag
    '{http://some/other/ns}*'    # any tag from a namespace
    Comment                      # comments (including their text!)
    )
...