[C#] Домашно Strings And Text Processing - 25 задача


20

 

25, Write a program that extracts from given HTML file its title (if available), and its body text without the HTML tags. Example:
 
<html>
  <head><title>News</title></head>
  <body><p><a href="http://academy.telerik.com">TelerikAcademy</a>
    aims to provide free real-world practical
    training for young people who want to turn into
    skillful .NET software engineers.</p></body>
</html>
 
Може би е раничко за тези задачи още, но поствам тази, за да ви подскажа за другите. Подсказката се състои в използване на регулярни изрази(regular expressions). 
Голяма, част от задачите могат да се решат с тях и спестява доста код и усилия. Ще се опитам да обесня моето решение.
 
1) Понеже идеята е да четем от HTML файл използваме класа StreamReader.
 
2) Използването на using ни подсигурява в това, че когато приключим работата с файла, стийма е затворен. 
 
3) В един while цикъл четем целия файл, ред по ред.
 
4) Тук идва важната част. Използваме MatchCollectionзащото искаме да ни мачне всики проявления на патерна в реда(патерн е тази последователност от символи, чрез която мачваме(селектираме,избираме) тази част от текста, която ни трябва). MatchCollection е еквивалента на /g (global).
В нашият случай патернът е следния - (?<=^|>)[^><]+?(?=<|$). С него му оказваме да мачне последователността от символи намиращи се между таговете > и <.
Има най-различни начини за мачване и най-различни вече готови патерни из интернет, за да не се налага да преоткриваме топлата вода.
 
5) С един foreach показваме всички мачнати колекции в реда, който сме прочели.
 
 
Задачи, от темата, които могат да се решат по-лесно и удобно с регулярни изрази: 4, 5, 12, 18,  25. За другите просто не съм сигурен как ще стане и дали ще е по-лесно. Предполагам, че ще ви послужат и на изпита. :)
 
Ресурси:
NetTuts - You Don’t Know Anything About Regular Expressions: A Complete Guide
NetTuts - 8 Regular Expressions You Should Know
NetTuts - Advanced Regular Expression Tips and Techniques
RegExr - Тул, който много олеснява работата с регулярни изрази. Има го и като програма, не само уеб приложение.

 




Отговори



0
Незнам как се използват регулярни изрази но явно са много полезни. Но няма да е несправедливо да се направи така че на изпит да не може да се ползват защото се губи идеята на задачата

от borisfrenkev (165 точки)


0
Ами решавал съм задачи от там с регулярни и системата си ги приема. Предполагам, че ще са позволени. Все едно да бяха забранили използването на многомерни масиви на пърив изпит. :) Иначе си прав, че се губи идеята за самите домашни, защото не се упражняват много стринговете, но щом може така, защо да не се използват. И в истинския живот бих ги използвал, ако улесняват работата. А някой по-запознат би ли споделил лоша практика ли е използването им от гледна точка на качествения код?
Едит: Ако не ги разбираш, наистина виж ресурсите, които съм посочил. Ще ги усвоиш за няколко часа. Гаранция. :)

от kirov (4821 точки)

0
Да регулярните изрази са много полезни, а иначе за задачата може да се реше и без тях, като имаш 2 състояния- отворено, което да бъде след срещнат < и затворено след срещнат > и когато сме в затворено състояние, добавяме символите в друг стринг, който накрая извеждаме.

от Plamen.Minkov (216 точки)


0

Благодаря много за линковете, колега, и аз ще хвана да ги разучавам тези регулярни изрази, 100% ще са полезни. Един съвет: при използването на текстови файлове. Не пиши пълен път, а само релативен, за да може задачите да работят и при хората, които ще ти ги оценяват. В смисъл на моя компютър тази папка не съществува:

@"C:\Users\Kirov\Desktop\text.html"

По-добре:

@"..\..\..\TestFiles\text.html"

Така текстовия файл ще бъде в директория "TestFiles" до солюшъна и направо си я архивираш и качваш с домашните, гарантирайки си да върви на всяка машина. :)


от ivaylo.kenov (30760 точки)


0
Благодаря за съвета. :)

от kirov (4821 точки)

0
Да днес Наков специално обърна внимание на релативния път...

от shristoff (747 точки)


11

Има една програма дето генерира Регулярни изрази. Безплатна е.

http://www.ultrapico.com/Expresso.htm

На някой може да му е полезна. 




0
Супер, колега, мерси много :) Подходяща е и за по-лесното изучаване и тестване на регулярните изрази и за припомнянето им в моя случай :)

от pavlinadrosos (950 точки)


4

Решение: source.

Както каза колегата, селектваме всичко, което се намира между ">" и "<". Аз съм го направил с ">(.*?)<".

P.S. Ето малко инфо, как трябва да се парсва HTML.


от jasssonpet (6814 точки)


0
идея как би трябвало да се парсва ХТМЛ като хората, ако знаеш някоя библиотека или пример. С регекс е най лесно но наистина е доста груб подход

от ge_or_gi (110 точки)

0
Има различни библиотеки за парсване на HTML, може да потърсиш в интернет.

от jasssonpet (6814 точки)



2

Решението ми не е много елегантно (без регулярни изрази, а с for цикъл и if-ове), но някоя идея може да ви бъде полезна.

Броя дали има отворен таг, и ако има, не печатам нищо, докато тага не се затвори (с брояча countOfOpenTags).

Думите ми се долепяха доста неприятно, затова създадох булева променлива  hasPrinted, която ми помага да слагам интервал след края на принтирането на съответната дума.

http://pastebin.com/L1CDcUTn




0
А защо броиш дали тага ти е отворен, като можеш да започнеш от там дали тага ти е затворен? Аз я направих така 1. Търся дали имам затваряне на таг 2. Търся дали веднага след него има отваряне на таг: - ако има, не записвам нишо - ако няма, записвам
виж http://pastebin.com/KCvyag8r



0
@kirov
Ако сложим обаче тагове в хиперлинка, т.е между кавички, решението ти не работи. Май ще трябва да се обхожда символ по символ както e направил Ники при CleanCode задачата.



0
Тогава би трябвало да се ескейпват с "<".

от jasssonpet (6814 точки)

0
да, тъкмо щях да си крия коментара щото прочетох че такива символи не могат да се съдържат в един хиперлинк



1

http://pastebin.com/6jjApsAz

Имаше задача от текстовите файлове като тази, като за втори път като, че ли я решех малко по-бързо.

Като цяло търся индекса на  този чар '>' след, който няма затварящ подобен и със субтринг намирам това, което е между тях, и съответно го принтирам.


от boncho.vylkov (1923 точки)


7

Ето едно доста просто решение без регулярни.

Remove-вам всичко, което започва с < и завършва на >.

http://pastebin.com/NH1KgThF


от VGeorgiev (2890 точки)


0
хубаво решение, използвах идеята аз да направя мое. само може би е добре да смениш името на файла си, мисля че е по-добре разширението да е .html :)


0
Видях, че пишеше в условието html файл, но не го смених поради простата причина, че почти няма разлика дали ще е txt или html. Просто 2 rename-a.

от VGeorgiev (2890 точки)


0
Аз тука откраднах на @kirov regex-a и идеята с MatchCollection ,само че входа ми е от стринг и въртя в for цикъл и като стигне края цикъла с foreach изписвам колекцията
http://pastebin.com/H9qXbSJi

от iwitass (3695 точки)


0

http://pastebin.com/0aZfTD1p

Моят вариятн на задачата, понеже ми беше интересно я направих да сваля директно страници от интернет в стринг. Което не чак толкова трудно. Особенното е че трябва да се декларира че искаме UTF8 за да може да се парсват символи на кирилица както трябва.

В кода има коментари и също линк към страницата от където съм взел метода за чистене на ХТМЛ тагове. 

Също закоментираната част от кода може да се доработи като се направи да сортира думите по някакъв критерии или по срещания. 

Ако някой знае как може да се направи така че да се покажат и ХТМЛ таговете който са след Bodi-то на страницата нека на каже. От това може да стане един чудесен малък scraper :)


от ge_or_gi (110 точки)