|
|
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Добрый день! Учебное задание: нужно распарсить HTML файл, удалив из него все теги, оставить только контент. Задание надо сделать вручную. Пыталась парсить с помощью regex, получается какой-то бред, т.к. в файле есть span, вложенные в div и подогнать нужный текст под шаблон не получается, т.к. span открывается, закрывается и не открывшись повторно, опять закрывается. <span style="white-space: pre-line" class='instruction__description js-steps__description _no-photo'><span>5. </span>НУЖНЫЙ ТЕКСТ</span> Pattern pattern = Pattern.compile(<(a|span|div|p|h?)[^>]*>(?<content>[^<]*)</(a|span|div|p|h?)>); Matcher matcher = pattern.matcher(htmlDocument); while (matcher.find()) { System.out.println(matcher.group()); doc = matcher.group(); } Перебирать посимвольно и удалять символы после того, как найдет открытый тег "<" искать закрытый ">" и удалять весь тег - по-моему так некорректно, в файле же могут быть математические знаки <>.Кроме того, при посимвольном парсинге с сайта выдается ошибка StringIndexOutOfBoundsException....Если загнать часть текста в переменную, то пасрится более-менее, но с учетом некорректности из-за возможного наличия математических знаков в тексте. while (i < htmlDocument.length()) { if (htmlDocument.charAt(i) == '<') { isTag = true; while (isTag) { if (htmlDocument.charAt(i+1)=='!') if (str.charAt(i) == '>') { isTag = false; } i++; } } else { stringList.add((String.valueOf(str.charAt(i)))); i++; } } Кроме того, при посимвольном парсинге выдается ошибка StringIndexOutOfBoundsException.... Что-то я совсем запуталась, может быть кто-то делал что подобное, подскажите пожалуйста!:-) Спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2017, 01:25 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
выкинуть теги - как-то так Код: java 1. надо еще флаги поставить типа mutiline, dotall,... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2017, 21:39 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Навскидку Код: html 1. table,tr,td тэги вы полагаете там не встречаются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 11:39 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Natalia_141277нужно распарсить HTML файл, удалив из него все теги, оставить только контент. Код: java 1. 2. 3. Natalia_141277с учетом некорректности из-за возможного наличия математических знаков в тексте. Если текст в html, то вместо <> используются коды & l t ; и & g t ; иначе и браузер не поймет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 12:58 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Dmitry., спасибо, а флаги для чего? я не спец, сорри за уточнение:-) разве мы по этой формуле не только script теги откидываем? просто мне надо теги без текста (контента внутри) откинуть, а из остальных получить контент (нужный текст с сайта), т.е. span|div et. надо оставить, чтобы получить текст, script-ы удалить полностью а это перебором посимвольно можно сделать? спасибо за ответ!:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 14:57 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
SQL2008, спасибо за уточнение, добавлю, а дальше как оттуда текст получить?:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 14:58 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
programania, спасибо большое за уточнение:-) часть проблемы снята:-) посимвольно это можно распарсить или с regex лучше? нам дали задание еще с помощью Enum попробовать, что эффективнее? спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 15:00 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Natalia_141277посимвольно это можно распарсить или с regex лучше? Посимвольно раз в 20 длиннее, не наглядно и не надежно, но может быть быстрее regex, т.к. regex в java на чистой java. С regex можно еще короче: s=s.replaceAll("<.+?>",""); Natalia_141277нам дали задание еще с помощью Enum попробовать, что эффективнее? Эффективность предсказать невозможно. Только через System.nanoTime() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 18:28 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
programaniaNatalia_141277посимвольно это можно распарсить или с regex лучше? Посимвольно раз в 20 длиннее, не наглядно и не надежно, но может быть быстрее regex, т.к. regex в java на чистой java. С regex можно еще короче: s=s.replaceAll("<.+?>",""); Natalia_141277нам дали задание еще с помощью Enum попробовать, что эффективнее? Эффективность предсказать невозможно. Только через System.nanoTime() s=s.replaceAll("<.+?>",""); - не подходит, т.к. так останется то, что в тегах script между <script>.....</script>. А regex можно как-то к Enum привязать, например, Enum типа String, в String засунуть regex и потом парсить по CASE? Или это лишнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 18:56 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
достаточно весь текст впихнуть в строку, и в строке сделать замену <.*?> на " ". Потом сделать замену \s+ на " " что бы убрать лишнее пустое место ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 23:42 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Natalia_141277, регуляркой эту задачу тоже можно решать. Но под конец она будет настолько сложна что ее будет невозможно не только дебажить но и просто осмыслить. Разумнее разбить весь процесс на какие-то фазы трансформаций типа: 1) Очистка и декодирование кодировок. 2) Удаление jscript 3) Удаление тегововой разметки, каментов. 4) Де-эскейпинг &-последовательностей, entities, CDATA ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 00:09 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Natalia_141277s=s.replaceAll("<.+?>",""); - не подходит, т.к. так останется то, что в тегах script между <script>.....</script>. В Учебном задании про script ничего не сказано: "Учебное задание: нужно распарсить HTML файл, удалив из него все теги, оставить только контент." Если учитывать что там еще не сказано, то может получиться такое: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 00:39 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
programania, вы забыли про кучу иных спецсимволов Я реализовал это так. Кстати здесь еще не все, а только те, что встречались в моем HTML. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 13:30 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
return html; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 13:31 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
SQL2008programania, вы забыли про кучу иных спецсимволов Я не забыл, но их там сотни, поэтому все писать не стал. В случае многочисленных замен лучше оформить это максимально наглядно и коротко. Например, в вашем примере вместо map.put(" ", " "); можно было бы сразу replace().replace().... если, конечно, это не "Учебное задание" где надо непременно показать знание Map. Я бы оформил это как замены по таблице: Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 18:12 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
mayton, правильно все логично, но только надо уложиться в максимально короткое время, идеально - в один цикл, два - уже хуже... спасибо за совет!:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 01:30 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
TREY, если бы все было так просто, это бы не было учебным заданием и я бы не задавала тут вопросы:-) 1.) комменты в тегах пропадут при таком парсинге; 2.) спецсимволы не распарсятся. как минимум 2 проблемы...:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 01:33 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
programania, спасибо большое, вы очень помогли!;-) особенно была проблема с возможными математическими знаками "<>", которые я вообще не представляла как парсить:-) ну как и компилятор собственно:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 01:39 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
SQL2008, спасибо большое!:-) C HashMap отличная идея, заброшу их все в отдельный класс и оттуда можно парсить, а полный перечень есть где-то? может библиотека спецсимволов HTML какая-то? И ее можно как-то в проект подтянуть, чтоб не делать отдельный класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 01:43 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Natalia_141277 а полный перечень есть где-то? может библиотека спецсимволов HTML какая-то? Да пожалуйста . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 06:34 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Или вот еще . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 06:35 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Natalia_141277... Учебное задание: нужно распарсить HTML файл, удалив из него все теги, оставить только контент. Задание надо сделать вручную. Пыталась парсить с помощью regex, получается какой-то бред, ... А слова "конечный автомат" уже в институтах/техникумах/ПТУ не проходят? Подозреваю, пытаться нужно так, как учил преподаватель на лекциях. А иначе, вне зависимости от кода - "получится какой-то бред" на зачете/экзамене. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 16:51 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
maytonNatalia_141277, регуляркой эту задачу тоже можно решать. Но под конец она будет настолько сложна что ее будет невозможно не только дебажить но и просто осмыслить. Назвать "решение регуляркой" - парсингом. Лично у меня язык не поворачивается maytonРазумнее разбить весь процесс на какие-то фазы трансформаций типа: 1) Очистка и декодирование кодировок. 2) Удаление jscript 3) Удаление тегововой разметки, каментов. 4) Де-эскейпинг &-последовательностей, entities, CDATA Нафига делать 100500 каких-то "фаз трансформации", когда все это элементарно вытягивается за один проход нормальным парсером в виде конечного автомата? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 16:57 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
IMHO Вирт как автор мне не очень нравится (((, но по теме топика сразу вспоминается: https://www.ozon.ru/context/detail/id/135695723/ Ну и я бы какие нибудь книжки по словам "теория конечных автоматов" поискал. Сам читал лет 20 назад, т.ч. ничего рекомендовать не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 17:00 |
|
||
|
Ручной парсинг HTML файла
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Спасибо, почитаю, пока сделала так, или это очень упрощенно? Спасибо! Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 17:36 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39416247&tid=2123069]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 419ms |

| 0 / 0 |
