Удаление определенных строк из файла - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать программу на python, которая очистит мою таблицу стилей от любых неиспользуемых классов.Я хочу удалить классы, которые не используются в DOm, из таблицы стилей.

Мне удалось извлечь все используемые классы из DOM, используя следующий код:

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

from flask import Flask, render_template

import requests
import cssutils
from bs4 import BeautifulSoup

'''

Scrape the given website's html for all class and id use cases within the tags.
Append all classes and ids to a dictionary for later use cases.

Remove all items in stylesheet that aren't in the dictionary / being used in the html.

@author Francesco Hayes
@date May 24, 2019


TODO:
Maybe use the join method to concatenate the rules in between the styles.

'''

WEB_URL = 'http://127.0.0.1:5500/website/index.html'

def get_page_classes(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    return [value for element in soup.find_all(class_=True) for value in element["class"]]


def get_file_classes(file):
    with open(file) as fp:
        return fp.read()


def convert_classes(classes, file_classes):
    new_lines = []    
    new_classes = []

    # loop over existing lines, do your changes, and build up a list of new_line

    for i in range(len(classes)):
        classes[i] = '.' + classes[i]
        new_classes.append(classes[i])
        print(new_classes)


    i = 0
    while i < len(file_classes):

        if file_classes[i] in new_classes:
            new_lines.append(file_classes[i])
            i += 1

            while file_classes[i][0] != '.':
                print(file_classes[i])
                new_lines.append(file_classes[i])
                i += 1

        else:
            i += 1


    return new_lines


def write_lines(file, lines):
    with open(file, 'w') as fp:
        for line in lines:
            fp.writelines(line)


page_classes = get_page_classes(WEB_URL)
print('Classes from Website: ', page_classes)

file_classes = get_file_classes("./website/style.css")
file_classes = file_classes.split()
print('\nClasses from Stylesheet: ', file_classes)

new_lines = convert_classes(page_classes, file_classes)
print('\nThe new stylesheet: ', new_lines)

write_lines("test.css", new_lines) 

Я попытался перебрать его как список и разделить классы по их индикатору: "".однако затем я сталкиваюсь с необходимостью переписать новые отфильтрованные стили в файл.Каждый класс будет нуждаться в '.'снова.

По сути, я пытаюсь автоматизировать процесс, который избавит меня от необходимости делать это вручную.

Надеюсь, это имеет смысл, а если нет, то я попытаюсь объяснить снова.Спасибо!

1 Ответ

0 голосов
/ 24 мая 2019

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

Обратите внимание, что во время тестирования лучше всего записать в другой файл.

Это также хорошая практика, чтобы ваши функции возвращали вещи, которые вы затем соединяете вместе в другом месте.Это сохраняет ваш код в чистоте и делает функции более легкими для чтения, отладки и повторного использования.

Мне неясно, что именно вы делаете, читая классы из DOM, а также из файла, поэтомуЯ подведу итоги здесь

from bs4 import BeautifulSoup
import requests

def get_page_classes(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    return [value for element in soup.find_all(class_=True) for value in element["class"]]

def get_file_classes(file):
    with open(file) as fp:
        return fp.readlines()

def convert_classes(classes, file_classes):
    new_lines = []
    # here you should loop over the lines, do your changes, and build up a list of new_line
    # for line in file_classes:
    #   . .. whatever... 
    #    new_lines.append(...) 
    return new_lines

def write_lines(file, lines):
    with open(target_file, 'w') as fp:
        for line in lines:
            fp.writeline(line)

page_classes = get_page_classes(WEB_URL)
file_classes = get_file_classes("./website/bootstrap.css")
new_lines = convert_classes(page_classes, file_classes)
write_lines("output.css", new_lines) 

Хорошая особенность разбиения его на функции состоит в том, что вы можете напечатать say, page_classes и закомментировать строки после, просто чтобы увидеть, что вы получаете от каждой функции,Обратите внимание, что функция write_lines на самом деле ничего не должна возвращать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...