Как я могу удалить весь HTML-тэг (и его содержание) его классом с помощью regex?

Привет всем, кто заинтересован.

Я хотел сохранить массив в текстовый файл Python и извлечь его полностью, чтобы я мог обратиться ко всем элементам.

Я продолжил свою проблему и решил ее с помощью очень грязного кода, я уверен.

Код ниже делает то, что я хотел сделать.

Бессмысленное упражнение, но я просто должен был это сделать.

Спасибо за вашу помощь и идеи.

my_list = []
my_list_669 = []

def create_list():
    #Creating the list

    for x in range(5):
        my_list.append(["Hello", "World", x])

    print("my_list = ", my_list)


def save_list_to_file():
    #creating the string

    string_1 = ""

    for item in my_list:
        string = item[0] + "," + item[1] + "," + str(item[2]) + "\n"
        string_1 += string
        #adds records to a string with a line return after each record

    with open('your_file.txt', 'w') as f:
            f.write(string_1)


def recover_list():

    with open('your_file.txt', 'r') as f:
            tiing = f.read().splitlines()
            #splits lines at \n and inserts into array called 'tiing'
            #each item is equivalent to a record

    for items1 in tiing:
        my_list_69 = items1.split(",")
        #splits the array items in ting at "," mark
        #these are now in an array called 'my_list_69'
        #below I access all items from within the list
        #and append them to a temporary sub-list

        sub_list = []
        for items in my_list_69:
            sub_list.append(items)

        my_list_669.append(sub_list)  this reconstructs the list


create_list()
save_list_to_file()
recover_list()

Testing:
print(my_list_669)
print(my_list_669[0])
print(my_list_669[0][2])
for items in my_list_669:
    print(items)
7
задан brian d foy 23 October 2008 в 01:09
поделиться

8 ответов

Вы также захотите допускать другие вещи перед классом в теге Div

<div[^>]*class="footer"[^>]*>(.*?)</div>

Кроме того, пойдите нечувствительные к регистру. Вы, возможно, должны выйти из вещей как кавычки или наклонной черты в закрывающем тэге. Какой контекст Вы выполняете в этом?

Также обратите внимание, что парсинг HTML с регулярными выражениями может быть очень противным, в зависимости от входа. Положительная сторона поднята в ответе ниже - предполагают, что у Вас есть структура как:

<div>
    <div class="footer">
        <div>Hi!</div>
    </div>
</div>

Попытка создать regex для этого является залогом провала. Ваш лучший выбор состоит в том, чтобы загрузить документ в DOM и выполнить манипуляции на этом.

Псевдокод, который должен отобразиться тесно на XML:: DOM:

document = //load document
divs = document.getElementsByTagName("div");
for(div in divs) {
    if(div.getAttributes["class"] == "footer") {
        parent = div.getParent();
        for(child in div.getChildren()) {
            // filter attribute types?
            parent.insertBefore(div, child);
        }
        parent.removeChild(div);
    }
}


Вот библиотека жемчуга, HTML:: DOM, и другой, XML:: DOM
.NET имеет встроенные библиотеки для обработки парсинга dom.
14
ответ дан 6 December 2019 в 06:04
поделиться

Как другие люди сказали, HTML известно хитер для контакта с использованием regexes, и подход DOM мог бы быть лучше. Например:

use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse_file( 'yourdocument.html' );

for my $node ( $tree->findnodes( '//*[@class="footer"]' ) ) {
    $node->replace_with_content;   # delete element, but not the children
}

print $tree->as_HTML;
17
ответ дан 6 December 2019 в 06:04
поделиться

В Perl Вам нужно /s модификатор, иначе точка не будет соответствовать новой строке.

Тем не менее использование надлежащего HTML или синтаксического анализатора XML для удаления нежелательных частей файла HTML является намного более соответствующим.

1
ответ дан 6 December 2019 в 06:04
поделиться
<div[^>]*class="footer"[^>]*>(.*?)</div>

Работавший для меня, но должен был использовать обратные косые черты перед специальными символами

<div[^>]*class=\"footer\"[^>]*>(.*?)<\/div>
1
ответ дан 6 December 2019 в 06:04
поделиться

Частично зависит от точного regex механизма, который Вы используете - который язык и т.д. Но одна возможность состоит в том, что необходимо выйти из кавычек и/или наклонной черты вправо. Вы могли бы также хотеть сделать это нечувствительным к регистру.

<div class=\"footer\".*?>(.*?)<\/div>

Иначе скажите, какой язык/платформу Вы используете-.NET, Java, жемчуг...

0
ответ дан 6 December 2019 в 06:04
поделиться

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

<([^\s]+).*?class="footer".*?>([.\n]*?)</([^\s]+)>

Ваша самая большая проблема будет вложенными тегами. Например:

<div class="footer"><b></b></div>

Данный regexp соответствовал бы всему через </b>, отъезд </div> свисание на конце. Необходимо будет или предположить, что тег, который Вы ищете, не имеет никаких вложенных элементов, или необходимо будет использовать своего рода синтаксический анализатор от HTML до DOM и запроса XPath для удаления всего поддерева.

0
ответ дан 6 December 2019 в 06:04
поделиться

Это будет хитро из-за жадности регулярных выражений, (Обратите внимание, что мои примеры могут быть характерны для жемчуга, но я знаю, что жадность является общим вопросом с REs.) Второе .*? будет соответствовать как можно больше перед </div>, таким образом, если у Вас есть следующее:

<div class="SomethingElse"><div class="footer"> stuff </div></div>

Выражение будет соответствовать:

<div class="footer"> stuff </div></div>

который маловероятен, что Вы хотите.

0
ответ дан 6 December 2019 в 06:04
поделиться

почему нет <div class="footer".*?</div> Я не regex гуру также, но я не думаю, что необходимо указать что последняя скобка для открытого тега Div

-3
ответ дан 6 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: