Как исправить мой сканер в C #? - PullRequest
0 голосов
/ 26 февраля 2010
Regex hrefs = new Regex("<a href.*?>");
Regex http = new Regex("http:.*?>");  
StringBuilder sb = new StringBuilder();
WebClient client = new WebClient();
string source = client.DownloadString("http://google.com");
foreach (Match m in hrefs.Matches(source)){
sb.Append(http.Match(m.ToString()));
Console.WriteLine(http.Match(m.ToString()));
}

коды работают нормально, но только однажды проблема Посмотрите на вывод.

http://images.google.se/imghp?hl=sv&tab=wi" onclick=gbar.qs(this) class=gb1>
http://video.google.se/?hl=sv&tab=wv" onclick=gbar.qs(this) class=gb1>
http://maps.google.se/maps?hl=sv&tab=wl" onclick=gbar.qs(this) class=gb1>
http://news.google.se/nwshp?hl=sv&tab=wn" onclick=gbar.qs(this) class=gb1>
http://translate.google.se/?hl=sv&tab=wT" onclick=gbar.qs(this) class=gb1>
http://mail.google.com/mail/?hl=sv&tab=wm" class=gb1>
http://www.google.se/intl/sv/options/" onclick="this.blur();gbar.tg(event);return !1" aria-haspopup=true class=gb3>
http://blogsearch.google.se/?hl=sv&tab=wb" onclick=gbar.qs(this) class=gb2>
http://www.youtube.com/?hl=sv&tab=w1&gl=SE" onclick=gbar.qs(this) class=gb2>
http://www.google.com/calendar/render?hl=sv&tab=wc" class=gb2>
http://picasaweb.google.se/home?hl=sv&tab=wq" onclick=gbar.qs(this) class=gb2>
http://docs.google.com/?hl=sv&tab=wo" class=gb2>
http://www.google.se/reader/view/?hl=sv&tab=wy" class=gb2>
http://sites.google.com/?hl=sv&tab=w3" class=gb2>
http://groups.google.se/grphp?hl=sv&tab=wg" onclick=gbar.qs(this) class=gb2>
http://www.google.se/ig%3Fhl%3Dsv%26source%3Diglk&usg=AFQjCNEsLWK4azJkUc3KrW46JTUSjK4vhA" class=gb4>
http://www.google.se/" class=gb4>
http://www.google.com/intl/sv/landing/games10/index.html">
http://www.google.com/ncr">

Как я могу удалить HTML-теги?

Ответы [ 7 ]

11 голосов
/ 26 февраля 2010

Измените свое регулярное выражение на:

Regex http = new Regex("http:.*?\"");

Или, что еще лучше, проанализируйте все ссылки, используя HtmlAgilityPack и Xpath:

var web = new HtmlWeb();
var doc = web.Load("http://www.stackoverflow.com");

var nodes = doc.DocumentNode.SelectNodes("//a[@href]"); // Will find all links

foreach (var node in nodes)
{
    Console.WriteLine(node.InnerHtml);
}
2 голосов
/ 26 февраля 2010

Быстрое решение состоит в том, чтобы изменить это:

Regex http = new Regex("http:.*?>");

К этому:

Regex http = new Regex("http:.*?\"");

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

0 голосов
/ 24 февраля 2011

FilesAndImages: <\s*(?<Tag>(applet|embed|frame|img|link|script|xml))\s*.*?(?<AttributeName>(src|href|xhref))\s*=\s*[\"\'](?<FileOrImage>.*?)[\"\']

Гиперссылки: <\s*(?<Tag>(a|form|frame))\s*.*?(?<AttributeName>(action|href|src))\s*=\s*[\"\'](?<HyperLink>.*?)[\"\']

0 голосов
/ 26 февраля 2010

Хорошее и простое решение. Соответствует любому символу после http: кроме символа «

»
"http:[^\"]*"
0 голосов
/ 26 февраля 2010
Regex hrefs = new Regex("<a href.*?>");
Regex http = new Regex("(http:.*?)\"");  
StringBuilder sb = new StringBuilder();
WebClient client = new WebClient();
string source = client.DownloadString("http://google.com");
foreach (Match m in hrefs.Matches(source))
{
    var value = http.Match(m.ToString()).Groups[1].Value;
    sb.Append(value);
    Console.WriteLine(value);
}
0 голосов
/ 26 февраля 2010

Измените закрывающий тег на "

0 голосов
/ 26 февраля 2010

Подстрока следующей строки http.Match (m.ToString ()) в http.Match (m.ToString (). Remove (m.ToString (). IndexOf ("\" ")))

Не самый чистый способ сделать это, но это работает

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