Arhn - архитектура программирования

Парсинг HTML построчно

Я работаю над кодом Python, предназначенным для анализа HTML. Цель здесь — найти строки в каждой строке и изменить их, как показано ниже:

Оригинал: "Криар Алерта"

<li><a href="http://..." target="_blank">Criar Alerta</a></li>

Ожидаемый результат: «Создать оповещение»

<li><a href="http://..." target="_blank">Create alert</a></li>

Затем, чтобы убедиться, что я создаю новый HTML-код с той же структурой, что и оригинал, мне нужно разобрать более поздний код построчно, идентифицировать строку и заменить ее эквивалентом из словаря.

Я видел здесь что BeautifulSoup может анализировать определенные теги. Я пробовал, но не уверен в результате.

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

Заранее спасибо,

Тьяго


  • Я видел сообщение здесь, которое привело меня к ссылка в моем вопросе. 24.06.2019
  • Я думаю, вам нужно быть немного более конкретным. Можете ли вы привести пример нескольких строк, соответствующего словаря и желаемого результата? 24.06.2019

Ответы:


1

Я считаю, что следующее то, что вы ищете.

Давайте используем 3 строки, две из которых содержат слова из вашего словаря, а одна нет — просто для проверки кода:

rep = """
      <li class="current"><a  style="color:#00233C;" href="index.html"><i class="icon icon-home"></i>  Início</a></li>
      <li class="current"><a  style="color:#00233C;" href="index.html"><i class="icon icon-home"></i>  Nunca</a></li>
      <li class="current"><a  style="color:#00233C;" href="index.html"><i class="icon icon-home"></i>  Criar Alerta</a></li>
    """

И используйте свой словарь (подсказка: никогда не стоит определять словарь как dict; это просто вызовет проблемы где-то в будущем...)

rep_dict = {
"Início": "Start",
"Ajuda": "Help",
"Criar Alerta": "Create Alert",
"Materiais e Estruturas": "Structures and Materials" 
}

Теперь к коду:

soup = BeautifulSoup(rep, 'lxml')

only_a_tags = soup.find_all('a')

for item in range(len(only_a_tags)):
    for word in rep_dict:
        if word in str(only_a_tags[item]):
            print(str(only_a_tags[item]).replace(word,rep_dict[word]))

Выход:

<a href="index.html" style="color:#00233C;"><i class="icon icon-home"></i>  Start</a>
<a href="index.html" style="color:#00233C;"><i class="icon icon-home"></i>  Create    Alert</a>

Элемент, содержащий «nunca», не был напечатан, потому что «nunca» отсутствует в rep_dict.

24.06.2019
  • Код отлично работал с моим html-файлом. Я напишу словарь в специальном файле .py, так как в нем более 200 записей, и его все еще можно обновлять. Вы правы насчет имени 'dict'. Огромное спасибо за помощь! 24.06.2019

  • 2

    @Джек Флитинг

    В приведенном ниже примере я хочу заменить «Início» на «Start»:

    Оригинал:

    <li class="current"><a  style="color:#00233C;" href="index.html"><i class="icon icon-home"></i>  Início</a></li>
    

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

    <li class="current"><a  style="color:#00233C;" href="index.html"><i class="icon icon-home"></i>  Start</a></li>
    

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

    dict = {
        "Início": "Start",
        "Ajuda": "Help",
        "Criar Alerta": "Create Alert",
        "Materiais e Estruturas": "Structures and Materials"
        ...
    }
    

    Ниже приведен код, который я написал, чтобы попрактиковаться в разборе HTML с помощью BeautifulSoup. (Я заметил, что все заменяемые строки находятся внутри тегов "a", затем я использовал SoupStrainer("a"))

    from bs4 import BeautifulSoup
    from bs4 import SoupStrainer
    
    with open(html_file, 'rb') as src:
        doc = src.read()
        src.close()
    
    only_a_tags = SoupStrainer("a")
    parse_1 = 'html.parser'
    soup = BeautifulSoup(doc, parse_1, parse_only=only_a_tags)
    
    print(soup.prettify())
    

    Исходная строка анализируется и печатается следующим образом:

    <a href="index.html" style="color:#00233C;">
     <i class="icon icon-home">
     </i>
     Início
    </a>
    

    Учитывая приведенный выше отпечаток, я не уверен, смогу ли я получить ожидаемый результат.

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

    К настоящему времени я хочу знать, как выполнить эту замену строк с помощью BeatifulSoup. После этого я напишу цикл for, чтобы, наконец, выполнить замену всех строк в файле HTML.

    Моей первой попыткой (до знакомства с BeautifulSoup) была работа над .txt-версией HTML-файла, читаемого как двоичный, что оказалось очень трудоемким и непродуктивным.

    24.06.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..