Разбор HTML построчно - PullRequest
1 голос
/ 24 июня 2019

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

Оригинал: «Criar Alerta»

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

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

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

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

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

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

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

Тиаго

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

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

Давайте использовать 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.

0 голосов
/ 24 июня 2019

@ Джек Мимолетный

В приведенном ниже примере я хочу заменить «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-файла, читаемого как двоичный файл, который оказался очень трудоемким и непродуктивным.

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