Python, как разделить и объединить символы символов в списке

Я пытаюсь вывести список, как показано ниже, но единственный список, который мне удалось создать, - это список символов. Может ли кто-нибудь указать мне правильное направление, пожалуйста. Я не могу использовать здесь regex.

Содержание файла doc.txt:

<html>
<head>
    <title>Testing tags only</title>
</head>
<body>
</body>
</html>

Код:

with open('doc.txt', 'r') as f:
    empty_tag_list = []
    # loop through all lines using f.readlines() method
    for line in f.readlines():
        new_line = []
        # this is how you would loop through each alphabet
        isTag = False
        for chars in line:
            if chars =="<":
                isTag = True
            if isTag ==True:
                empty_tag_list.append(chars)
            if chars ==">":
                isTag = False
                empty_tag_list.append(new_line)
                empty_tag_list.remove("<")
                empty_tag_list.remove(">")
    print(empty_tag_list)

Выход:

['h', 't', 'm', 'l', [], 'h', 'e', 'a', 'd', [], 't', 'i', 't', 'l', 'e', [], '/', 't', 'i', 't', 'l', 'e', [], '/', 'h', 'e', 'a', 'd', [], 'b', 'o', 'd', 'y', [], '/', 'b', 'o', 'd', 'y', [], '/', 'h', 't', 'm', 'l', []]

Как я могу получить результат как:

[html,head,title,/title,/head,body,/body,/html]

вы можете отредактировать свой пост с примером содержания вашего исходного файла?

Dadep 10.09.2018 10:00

Вы пробовали просто использовать регулярное выражение, например re.findall(r'<(/?\w+).*?>', text)?

tobias_k 10.09.2018 10:16
0
2
206
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Предполагая, что вам нужен list тегов, вы можете сделать следующее:

for line in f.readlines():
    new_line = ''
    isTag = False
    for char in line:
        if char == "<":
            isTag = True
        elif char == ">":
            isTag = False
            empty_tag_list.append(new_line)
            new_line = ''
        elif isTag:
            new_line += char
print(empty_tag_list)
# ['html', 'head', 'title', '/title', '/head', 'body', '/body', '/html']
Ответ принят как подходящий

Вы должны объединять новые символы в строку, а не добавлять их в список. Добавляйте новую строку в список вывода только в начале тега:

with open('doc.txt', 'r') as f:
    empty_tag_list = []
    for line in f:
        isTag = False
        for chars in line:
            if chars == "<":
                isTag = True
                empty_tag_list.append('')
            elif chars == ">":
                isTag = False
            elif isTag:
                empty_tag_list[-1] += chars
    print(empty_tag_list)

Вместо того, чтобы вручную повторять и проверять каждый символ, я бы предложил использовать регулярное выражение:

import re
with open("doc.txt") as f:
    text = "".join(f)
    tags = re.findall(r'<(/?\w+).*?>', text)

Здесь <(/?\w+).*?> означает <, за которым следуют необязательный / и символы-слова (необходимо сохранить), затем, необязательно, еще один материал и >. Впоследствии tags становится ['html', 'head', 'title', '/title', '/head', 'body', '/body', '/html'].

Для более сложных задач вы также можете рассмотреть возможность использования подходящего парсера HTML, такого как Beautiful Soup, но для этого может быть достаточно регулярного выражения.

Другие вопросы по теме