Python, как искать и исправлять HTML-теги и атрибуты? - PullRequest
1 голос
/ 29 июля 2010

Я должен исправить все закрывающие теги тега <img>, как показано в тексте ниже.Вместо того, чтобы закрывать <img> с помощью >, он должен закрываться с />.

. Есть ли простой способ найти все <img> в этом тексте и исправить >?

(Если он уже закрыт />, то никаких действий не требуется).

Другой вопрос, если для <img> нет "ширины" или "высоты"уточнил, как лучше всего решить проблему?

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

Правильный тег <img> - это тот, который заканчивается на /> иимеют действительную ширину и высоту.

<a href="http://www.cultofmac.com/daily-deals749-mac-mini-1199-3-0ghz-imac-new-mac-pros/52674"><img align="left" hspace="5" width="150" src="http://s3.dlnws.com/images/products/images/749000/749208-large" alt="" title=""></a>
Apple today unleashed a number of goodies, including giving iMacs and Mac Pros more oomph with new processors and increased storage options. We have those deals today, along with many more items for the Mac lover. Along with the refreshed line of iMacs and Mac Pros, we’ll also look at a number of software deals [...]
<p><a href="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/0/da"><img src="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/0/di" border="0" ismap></a><br>
<a href="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/1/da"><img src="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/1/di" border="0" ismap></a></p><img src="http://feeds.feedburner.com/~r/cultofmac/bFow/~4/Mq5iLOaT50k" height="1" width="1">

Мне действительно нужно иметь width и height на выходе, потому что он будет использоваться в качестве входных данных для другого парсера.И этот синтаксический анализатор говорит, что тег <img ДОЛЖЕН закрываться с />.Я не использую вывод для просмотра на веб-странице.Пожалуйста, предложите простое решение для достижения этой цели!

Ответы [ 3 ]

0 голосов
/ 29 июля 2010

Ради простоты я бы передал потенциально раздражающие проблемы, связанные с анализом (X) HTML, в выделенную библиотеку:

Вот простой пример с lxml.html :

import lxml.html

page = """<html>...</html>"""
page = lxml.html.document_fromstring(page)
lxml.html.tostring(page)

lxml.html имеет действительно удобный модуль clean, предназначенный для удаления вредоносного кода.Это также просто:

from lxml.html.clean import clean_html
clean_html(page)
0 голосов
/ 23 мая 2014

Это по-прежнему главный ответ на этот запрос Google, и, возможно, это потому, что я недостаточно хорошо понял вопрос.

То, что я искал (и, возможно, то, что искал OP), было дампом XML вместо дамп HTML.

Поэтому, чтобы разобрать и получить вывод, который мне нужен для правильной передачи, я использовал lxml.html, как сказал @ Тим Макнамара.

import lxml.html
# read in the file
html_obj = lxml.html.fromstring(raw_html)
# whatever other dom manipulation you need to do
lxml.html.tostring(html_obj, method='xml')
0 голосов
/ 29 июля 2010

Ну,правильный HTML,не.Не знаю, что говорит HTML5, но XHTML в основном мертв, прежде чем жить.

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

re.sub(r"<img(.*?)(?<!/)>", lambda m: "<img%s/>" % m.groups()[0],  html_code)

В остальном все сложно.Я бы проанализировал код, добавил теги к узлам img и написал HTML-код от ast.Синтаксический анализ должен быть возможен с http://code.google.com/p/html5lib/. Но чтобы иметь правильную высоту и ширину, вы должны прочитать изображения (используйте PIL), вероятно, не стоит усилий.

...