Как переформатировать CSV с необработанным HTML в очищенный набор данных CSV? - PullRequest
0 голосов
/ 05 февраля 2019

Мне дали набор данных, в котором мне нужно преобразовать html, встроенный в ячейку, в чистый hsml-код с разделителями.Ожидаемый результат представлен.В html находятся файлы, которые идентифицируются индивидуально, и каждый файл должен иметь свою собственную строку.Столбцы находятся в отдельной ячейке и имеют отдельные ключевые слова, также встроенные в HTML, их необходимо сгенерировать в новый столбец и идентифицировать как ИСТИНА (условие, если ключевое слово найдено в строке), или ЛОЖЬ (условие, если ключевое слово не найдено.в ряд).Решение должно быть чувствительным к ключевым словам, сгенерированным ранее и идентифицированным как ИСТИНА.

Я выполнял поиск похожих проблем для примеров, но эта проблема, похоже, не соответствует моему известному техническому языку (я непрофессионал в очистке данных) или требования необычны.

Это типичная строка в CSV ...

    "<div id="categories">
    <h3>Categories</h3>
    <ul>
    <li><a href="">Keyword1</a></li>
    <li><a href="">Keyword2</a></li>
    </ul>
    </div>
    ","<div id="file"><h3>File</h3>, <div id="image">
    <a href="A">A.jpg</a>
    <br/></div>
    ,  <div id="image">
    <a href="B">B.jpg</a>
    <br/></div>
    </div>
    "

Количество ключевых слов и файлов в каждой строке варьируется.

Ожидаемый результат

File, Keyword1, Keyword2, Keyword3
A.jpg, TRUE, TRUE, FALSE
B.jpg, TRUE, TRUE, FALSE
C.jpg, TRUE, FALSE, TRUE
D.jpg, FALSE, FALSE, TRUE
E.jpg, FALSE, FALSE, TRUE

1 Ответ

0 голосов
/ 05 февраля 2019

Вот способ получить желаемый результат, используя BeautifulSoup:

from bs4 import BeautifulSoup as bs


a = '''
    <div id="categories">
        <h3>Categories</h3>
        <ul>
            <li><a href="">Keyword1</a></li>
            <li><a href="">Keyword2</a></li>
        </ul>
    </div>
    ","
    <div id="file">
        <h3>File</h3>,
        <div id="image">
            <a href="A">A.jpg</a>
            <br/>
        </div>
        ,
        <div id="image">
            <a href="B">B.jpg</a>
            <br/>
        </div>
    </div>
'''


def find_elms(soup, tag, attribute):
    """Find the block using it's tag and attribute values"""
    categories_block = soup.find(tag, attribute)
    if categories_block:
        return [elm.text for elm in categories_block.findAll('a')]
    return []


def pretty_print(master, categories, files):
    """Here we're just better printing the output"""
    cat = '\t'.join(['{elm:<12}'.format(elm=elm) for elm in master])
    print(cat)
    for k in files:
        out = '{file_:<12}'.format(file_=k)
        cells = '\t'.join(
            ['{:<12}'.format(str(True if j in categories else False)) for j in master[1:]]
        )
        print(out, cells)


master_categories = ['File', 'Keyword1', 'Keyword2', 'Keyword3']
soup = bs(a, 'html.parser')
categories = find_elms(soup, 'div', {'id': 'categories'})
files = find_elms(soup, 'div', {'id': 'file'})
pretty_print(master_categories, categories, files)

Выход:

File            Keyword1        Keyword2        Keyword3    
A.jpg        True           True            False       
B.jpg        True           True            False 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...