Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Обрезать HTML  [new]
Maksimka-27
Member

Откуда:
Сообщений: 16
Не нашел, куда лучше, поместил сюда ...

Задача. Есть строка в формате html, например

<h2>Вот заголовочек<small>и маленькое дополнение<small></h2>
<p>Какой-то параграф</p>
<ul><li><b>1 строка<b> списка</li>
<li>2 строка списка</li></ul>
<p>И еще какой-то параграф</p>


Нужно получить текст определенной длины (например 70 знаков - заканчивается на "1 строка спи"), при этом закрыть грамотно все теги.

Как можно реализовать? (желательно c#)
29 июн 20, 05:09    [22158757]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1543
Maksimka-27,

ЯННП
29 июн 20, 05:20    [22158760]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
x1ca4064
Member

Откуда:
Сообщений: 1140
Maksimka-27


Нужно получить текст определенной длины (например 70 знаков - заканчивается на "1 строка спи"), при этом закрыть грамотно все теги.

Как можно реализовать? (желательно c#)


Вы привели пример входных данных, но не привели пример результата. Общий принцип прост: парсите входной html, получаете дерево тегов, начинаете его обходить, для каждого тега получаете его текст (в Вашем понимании), пока сумма длин текстов тегов не превысит заданную.
Что значит закрыть все теги, я не понял.

Вопрос выглядит, как попытка решить какую-то задачу, о которой Вы ничего не сообщаете.
29 июн 20, 06:06    [22158763]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Maksimka-27
Member

Откуда:
Сообщений: 16
Вы привели пример входных данных, но не привели пример результата. [/quot]

<h2>Вот заголовочек<small>и маленькое дополнение<small></h2>
<p>Какой-то параграф</p>
<ul><li><b>1 строка<b> спи
<!-- длина текста без тегов выше - 70 знаков. Далее - дописанные программно теги -->
</li></ul>


Как посчитать, где резать эти 70 символов
Как понять, какие теги закрывать.

Вроде бы однозначный вопрос
29 июн 20, 08:12    [22158797]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
x1ca4064
Member

Откуда:
Сообщений: 1140
Maksimka-27


Вроде бы однозначный вопрос


Лично для меня - нет. Т.к. не ясно, что вывод должен быть в html, например.

По сути:

Рассмотрите немного другую задачу: по дереву тегов воссоздать html. Для этого придется сделать рекурсивную процедуру обхода дерева, которая будет выдавать результирующий html, добавьте в нее текущую длину выведенного текста, если для данного узла длина текста+переданная длина превысила требуемую, выводите только кусок текста и начинайте возврат по рекурсии, что закроет теги.
29 июн 20, 08:57    [22158817]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10422
x1ca4064
что закроет теги.
... и добавит текста.
29 июн 20, 09:13    [22158820]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
x1ca4064
Member

Откуда:
Сообщений: 1140
Basil A. Sidorov
x1ca4064
что закроет теги.
... и добавит текста.
Это во власти пишущего :)

Сообщение было отредактировано: 29 июн 20, 09:16
29 июн 20, 09:18    [22158822]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50840
Maksimka-27
Как посчитать, где резать эти 70 символов

На пальцах... пальцев не хватит. Значит придётся заводить счётчик символов целого типа.

Maksimka-27
Как понять, какие теги закрывать.

Посчитав парность каждого из встреченных перед достижением счётчиком из предыдущего параграфа заданного значения.
29 июн 20, 13:59    [22159053]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
x1ca4064
Member

Откуда:
Сообщений: 1140
Dimitry Sibiryakov

Посчитав парность каждого из встреченных перед достижением счётчиком из предыдущего параграфа заданного значения.


Думаю, это подойдет к Xml, но не к html.
29 июн 20, 20:38    [22159253]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6352
x1ca4064
Dimitry Sibiryakov

Посчитав парность каждого из встреченных перед достижением счётчиком из предыдущего параграфа заданного значения.


Думаю, это подойдет к Xml, но не к html.


В html все теги (почти - есть hr, br) должны быть открыты/закрыты. Поэтому вполне реально.
30 июн 20, 05:39    [22159377]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50840
Хотя, конечно, есть определённый бардак с опциональным закрытием, как у <P>, например, но ТС-у можно считать только те тэги, которые обязательно требуют парности.
30 июн 20, 13:46    [22159653]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
fkthat
Member

Откуда:
Сообщений: 3030
Разбираем HTML в дерево, подсчитываем длину узлов. Потом начинаем перебирать узлы "снизу вверх от последнего к первому" либо пытаясь обрезать, если это текстовый узел, либо выкидывая узел целиком, каждый раз дерево перерасчитываем. Повторяем этот процесс пока не достигнем нужной полной длины. Как-то так.
30 июн 20, 19:10    [22159928]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
fkthat
Member

Откуда:
Сообщений: 3030
Dimitry Sibiryakov
Хотя, конечно, есть определённый бардак с опциональным закрытием, как у <P>, например, но ТС-у можно считать только те тэги, которые обязательно требуют парности.

Да пофиг на весь бардак с ХТМЛ - можно ведь парсить не XML-парсером, а взять тот же HTML Agility Pack и парсить им.
30 июн 20, 19:14    [22159931]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50840
Лично мне было бы проще написать свой собственный парсер, там всего-то будет автомат на 4-5 состояний чем разбираться с какой-то чужой библиотекой, которая почти наверняка предназначена не совсем для этого.

Сообщение было отредактировано: 1 июл 20, 14:50
1 июл 20, 14:52    [22160207]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
K23
Member

Откуда:
Сообщений: 27
Maksimka-27
Не нашел, куда лучше, поместил сюда ...

Задача. Есть строка в формате html, например

<h2>Вот заголовочек<small>и маленькое дополнение<small></h2>
<p>Какой-то параграф</p>
<ul><li><b>1 строка<b> списка</li>
<li>2 строка списка</li></ul>
<p>И еще какой-то параграф</p>


Нужно получить текст определенной длины (например 70 знаков - заканчивается на "1 строка спи"), при этом закрыть грамотно все теги.

Как можно реализовать? (желательно c#)


Решение на js https://github.com/brankosekulic/trimHtml

Здесь ещё на php
https://stackoverflow.com/questions/830283/cutting-html-strings-without-breaking-html-tags
https://stackoverflow.com/questions/3810230/close-open-html-tags-in-a-string
2 июл 20, 21:19    [22161225]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
fkthat
Member

Откуда:
Сообщений: 3030
Dimitry Sibiryakov
Лично мне было бы проще написать свой собственный парсер, там всего-то будет автомат на 4-5 состояний чем разбираться с какой-то чужой библиотекой, которая почти наверняка предназначена не совсем для этого.

Собственный парсер HTML? Ну-ну, писатель... Картинка с другого сайта.
2 июл 20, 21:24    [22161228]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
K23
Member

Откуда:
Сообщений: 27
fkthat
Dimitry Sibiryakov
Лично мне было бы проще написать свой собственный парсер, там всего-то будет автомат на 4-5 состояний чем разбираться с какой-то чужой библиотекой, которая почти наверняка предназначена не совсем для этого.

Собственный парсер HTML? Ну-ну, писатель... Картинка с другого сайта.


Для этой задачи не требуется полноценный парсер, только его очень ограниченное подмножество, которое реально написать вручную.
2 июл 20, 21:53    [22161249]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
x1ca4064
Member

Откуда:
Сообщений: 1140
fkthat

Собственный парсер HTML? Ну-ну, писатель... Картинка с другого сайта.


А что такого? Всякий программист, в процессе своего становления, должен написать несколько сортировок, транслятор с кого-то языка, в наше время, парсер html/xml/json + свой формат, тетрис, вебсервер, распознавалку MNIST. Еще что-то, по вкусу.
2 июл 20, 22:06    [22161255]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
x1ca4064
Member

Откуда:
Сообщений: 1140
K23,

Раньше еще архиватор был :)
2 июл 20, 22:08    [22161256]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
fkthat
Member

Откуда:
Сообщений: 3030
x1ca4064
А что такого? Всякий программист, в процессе своего становления, должен написать несколько сортировок, транслятор с кого-то языка, в наше время, парсер html/xml/json + свой формат, тетрис, вебсервер, распознавалку MNIST. Еще что-то, по вкусу.

Только кому все это нахрен надо? Не лучше ли потратить время более продуктивно, освоив уже что-то готовое, вместо того чтобы писать свой говновелосипед?
3 июл 20, 01:03    [22161330]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
K23
Member

Откуда:
Сообщений: 27
fkthat
x1ca4064
А что такого? Всякий программист, в процессе своего становления, должен написать несколько сортировок, транслятор с кого-то языка, в наше время, парсер html/xml/json + свой формат, тетрис, вебсервер, распознавалку MNIST. Еще что-то, по вкусу.

Только кому все это нахрен надо? Не лучше ли потратить время более продуктивно, освоив уже что-то готовое, вместо того чтобы писать свой говновелосипед?


Такие проекты полезны для обучения. Именно для получения более фундаментальных знаний, чтобы понимать как всё устроено внутри. Осваивать готовое тоже надо для практических задач, без этого никак.
3 июл 20, 10:01    [22161444]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50840
K23
Для этой задачи не требуется полноценный парсер, только его очень ограниченное подмножество

Причём подмножество, реально ограниченное поиском угловых скобок.
3 июл 20, 14:11    [22161616]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
x1ca4064
fkthat

Собственный парсер HTML? Ну-ну, писатель... Картинка с другого сайта.


А что такого? Всякий программист, в процессе своего становления, должен написать несколько сортировок, транслятор с кого-то языка, в наше время, парсер html/xml/json + свой формат, тетрис, вебсервер, распознавалку MNIST. Еще что-то, по вкусу.

К чорту мелочи.

Свою DBMS на файлах! И свой язык программирования.
3 июл 20, 15:43    [22161707]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
mini.weblab
Member

Откуда:
Сообщений: 1027
лучше переходить на Питон!

Python:
https://repl.it/repls/LightDisfiguredRefactoring#main.py
from bs4 import BeautifulSoup

html_doc = """<h2>Вот заголовочек<small>и маленькое дополнение<small></h2>
<p>Какой-то параграф</p>
<ul><li><b>1 строка<b> списка</li>
<li>2 строка списка</li></ul>
<p>И еще какой-то параграф</p>"""

soup = BeautifulSoup(html_doc, 'html.parser')

text = soup.get_text();
first_seventy_chars = text[:70]
print("The first 70 characters:\n")
print(first_seventy_chars)


Сообщение было отредактировано: 4 июл 20, 13:34
4 июл 20, 13:36    [22162016]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
да HTML-парсер в любом языке есть.
даже в линухе куча бинарников: html2csv, html2pdf, html2text, html2epub итд
можно посмотреть в сырцах, какую либу они юзают для парсинга
Dimitry Sibiryakov
Хотя, конечно, есть определённый бардак с опциональным закрытием, как у <P>, например, но ТС-у можно считать только те тэги, которые обязательно требуют парности.

а чё <p> можно не закрывать? браузер ругнётся.
его конечно можно правильно обработать, но это неправильно.

Сообщение было отредактировано: 4 июл 20, 15:06
4 июл 20, 15:05    [22162046]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10422
Алексей Роза
а чё <p> можно не закрывать?
А самому посмотреть - вообще никак?
браузер ругнётся.
Ню-ню ...
4 июл 20, 15:23    [22162051]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
не закрывать тэги - плохая привычка.

Сообщение было отредактировано: 6 июл 20, 09:16
4 июл 20, 17:36    [22162096]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
fkthat
Member

Откуда:
Сообщений: 3030
Алексей Роза
не закрывать тэги - плохая привычка.

HTML это все-таки не XML и спецификация HTML5 разрешает многие теги не закрывать (что, лично я считаю, не очень хорошо, но так уж оно есть).
5 июл 20, 04:32    [22162251]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Изопропил
Member

Откуда:
Сообщений: 31518
fkthat
Алексей Роза
не закрывать тэги - плохая привычка.

HTML это все-таки не XML и спецификация HTML5 разрешает многие теги не закрывать (что, лично я считаю, не очень хорошо, но так уж оно есть).

https://css-live.ru/verstka/do-not-close-tags.html
Лучше не фантазировать, а просто соблюдать стандарты
Возможно меняя привычки
5 июл 20, 09:30    [22162269]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
fkthat
Member

Откуда:
Сообщений: 3030
Изопропил
просто соблюдать стандарты

Ну так и закрыть будет по стандарту и незакрыть будет по стандарту, т.ч. это уже дело вкуса. Вот то, что большинство тегов в принципе нельзя делать self-closed это часто действительно раздражает.
5 июл 20, 10:19    [22162282]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
Изопропил
https://css-live.ru/verstka/do-not-close-tags.html
Лучше не фантазировать, а просто соблюдать стандарты
Возможно меняя привычки

А ещё лучше хернёй не заниматься и просто закрывать ВСЕ закрываемые теги.
Я смотрю на это количество "если" и мне уже хочется в окно выйти. Мне предлагают всё это в голове держать. Она же у меня пустая, там просторно и много места.
А ещё предлагают в коде запоминать, где там был открытый тег, и где он в итоге примерно должен был закрыться... тут? или тут? а может тут?
А кроме того - самому браузеру, на уровне парсинга, тоже должно быть сложнее высчитывать место, в котором тег должен закрываться.
Да и HTML-парсеры, C/C++ либы - они то сумеют распарсить код БЕЗ тегов?
Какой-то дебил вылез со своими "гениальными" идеями "не закрывайте теги!", ну и что? Мы их ловим, сажаем в психушку и живём дальше.

Сообщение было отредактировано: 5 июл 20, 12:24
5 июл 20, 12:18    [22162307]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
x1ca4064
Dimitry Sibiryakov

Посчитав парность каждого из встреченных перед достижением счётчиком из предыдущего параграфа заданного значения.


Думаю, это подойдет к Xml, но не к html.

Технически эта война стандартов закончилась после появления HTML5. Далее дороги XML/Html5 разошлись.

Требование закрытия тегов существовало только в XHTML и этот стандарт так и не стал главным или обязательным
для браузеров. После HTML5 - был взят курс на функциональность внедяемых элементов таких как <canvas>,
<video>, <audio>, а строгий формализм не был принят во внимание как главный.

На сегодняшний день - для линейки браузеров Mozilla/IE/Chrome нет такой проблемы как незакрытый тег.
Они - тего-толератны. И верстальщики лупят незакрытые <img>, <br>, <ht> просто потому что им так быстрее.

Но вы можете делать strict-генерацию контента если у вас сайт в рамках вашего предприятия или
вам просто так удобно для его-же scrape или трансформации в другие форматы. Ну... если-бы
я делал @Generated содержание то скорее всего тоже закрывал-бы теги просто потому что это
выглядит строго да и самому как-то приятнее.
5 июл 20, 12:46    [22162314]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50840
mayton
И верстальщики лупят незакрытые <img>, <br>, <ht> просто потому что им так быстрее.

Теги, закрывать которые нельзя

Это пустые (void) элементы: area, base, br, col, embed, hr, img, input, link, meta, param, source, track, wbr.

Многие поспешат возразить: «Это же самозакрывающие(ся) теги, у них свой способ закрытия — слеш перед >!». Что ж, их ждет сюрприз: в HTML этот слеш… не значит ничего! Он не считается ошибкой, чтобы было легче переходить с XHTML, но «самозакрытыми», точнее, не требующими закрытия, их делает не слеш, а «зашитый» в алгоритм парсинга список этих пустых элементов. И «закрыть» по аналогии, скажем, <div /> нельзя — для HTML это будет открывающий тег (притом уже с ошибкой). Только для SVG- и MathML-элементов (напр. <g />) этот слеш означает честное «самозакрытие» (т.е. сокращение для <g></g>).
5 июл 20, 13:46    [22162327]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
fkthat
Member

Откуда:
Сообщений: 3030
Алексей Роза
Да и HTML-парсеры, C/C++ либы - они то сумеют распарсить код БЕЗ тегов?

Если это действительно HTML-, а не просто XML- парсер, то сумеет.
5 июл 20, 17:19    [22162378]     Ответить | Цитировать Сообщить модератору
 Re: Обрезать HTML  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
fkthat
Алексей Роза
Да и HTML-парсеры, C/C++ либы - они то сумеют распарсить код БЕЗ тегов?

Если это действительно HTML-, а не просто XML- парсер, то сумеет.

JSoup хавает.
5 июл 20, 17:22    [22162380]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Программирование Ответить