Команда HttpWebRequest для получения списка каталогов - PullRequest
0 голосов
/ 23 ноября 2010

В следующем посте я следовал за примерами, чтобы создать мой httprequest и список файлов из каталога webServer: C # Команда HttpWebRequest для получения списка каталогов

Я пытаюсь использовать этот пример для вывода списка файлов с моего веб-сервера. Я могу перечислить файлы с примера сервера, указанного в ссылке, но мой сервер просто показывает последний добавленный файл. Мой код точно такой же, как пример. Я заметил, что мой HTML-код немного отличается. У кого-то есть идея:

<code><html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>186.215.156.154 - /download/Zatix/Zatix - Satisfação Geral/</title>
</head>
<body>
    <h1>
        186.215.156.154 - /download/Zatix/Zatix - Satisfação Geral/</h1>
    <hr>
    <pre>
    <a href="/download/Zatix/">[Para a pasta superior]</a>
    <br>
    <br>
    sexta-feira, 19 de novembro de 2010    11:17        52355 <a href="/download/Zatix/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral_3_00.zip">Zatix - Satisfação Geral_3_00.zip</a><br>sexta-feira, 19 de novembro de 2010    11:17        52355 <a href="/download/Zatix/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral_4_00.zip">Zatix - Satisfação Geral_4_00.zip</a>
    <br>

Я думаю, что мне нужно что-то изменить в возврате метода GetDirectoryListingRegexForUrl.

Мой код выглядит примерно так:

private string GetDirectoryListingRegexForUrl(string url)
{
    if (url.Equals(Url));
    {
        return "<A HREF=\".*\">(?<name>.*)</A>";                   
    }
    throw new NotSupportedException();
}

public void ListStudies()
{
    Url = BaseUrl + this.clientName + "/" + this.activeStudy + "/";
    Console.WriteLine(Url);
    CookieContainer cookies;
    HttpWebResponse response;
    HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(Url);            

    req.Credentials = _NetworkCredential;
    req.CookieContainer = new CookieContainer();
    req.AllowAutoRedirect = true;
    cookies = req.CookieContainer;

    try
    {
        response = (HttpWebResponse)req.GetResponse();

        if (response.StatusCode != HttpStatusCode.OK)
            Console.WriteLine("URL NÃO RESPONDEU");
        else
            Console.WriteLine("URL OK");

        using (response)
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string html = reader.ReadToEnd();
                Regex regex = new Regex(GetDirectoryListingRegexForUrl(Url));
                MatchCollection matches = regex.Matches(html);                                             

                if (matches.Count > 0)
                {
                    foreach (Match match in matches)
                    {
                        if (match.Success)
                        {
                            Console.WriteLine(match.Groups["name"]);                                    
                        }                                
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message, "Update Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }            
}

Надеюсь, вы мне поможете! Спасибо.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Вот правильное регулярное выражение:

<A HREF=\".*?\">(?<name>.*?)</A>

Сравните с оригиналом:

<A HREF=\".*\">(?<name>.*)</A>

Проблема заключается в операторах повторения .*, которые по умолчанию жадные. Жадность означает, что регулярное выражение будет расширяться, насколько это возможно, при поиске совпадения. Это означает, что он будет начинаться с первого <A и заканчивается последним A> в строке, пропуская все между ними. Это «все» включает остальные <A...A> в середине.

Вы должны указать, что операторы повторения ленивы. Вы делаете это, добавляя к ним ? как .*?.

P.S. Разбор HTML с помощью регулярных выражений, как известно, плохая идея. Это нормально, если вам нужно быстрое и грязное исправление, но нет необходимости в долгосрочном решении. Добавьте к этому тот факт, что в вашем случае выходные данные будут отличаться для каждого сервера и, вероятно, для каждой версии сервера. Код не является универсально-функциональным. Пожалуйста, рассмотрите другой подход, например, переговоры с сервером напрямую для получения списка каталогов (если у вас, конечно, есть доступ).

И, наконец, несколько забавных тем для чтения:

Разбор HTML Путь Ктулху

RegEx соответствуют открытым тегам, кроме автономных тегов XHTML

1 голос
/ 23 ноября 2010

Две основные проблемы здесь.

1).Вывод такого запроса совершенно произвольный и даже не гарантируется.Это проблема сервера.

2).Регулярное выражение не подходит для анализа HTML или любой подобной структуры, потому что это не обычная грамматика.Лучше всего, если в ответе у вас есть какая-либо надежность, полагаться на что-то наподобие HtmlAgilityPack для обеспечения строгого XHTML-документа (может не потребоваться, если вам повезет) и читать егоXML-документ с запросами XPath для извлечения интересующего вас контента.

...