Разбор ссылок и получение лишних пробелов - PullRequest
1 голос
/ 06 июня 2011

Я анализирую веб-страницу для ссылок http, сначала анализируя все привязанные теги, затем анализируя теги href, затем запускаю регулярное выражение для удаления всех тегов, которые не являются независимыми ссылками (например, href = "/ img / link.php ").Следующий код работает правильно, но также добавляет много пустых строк между проанализированными ссылками.

while (parse.ParseNext("a", out tag))
{
    string value;
    //A REGEX value, this one finds proper http address'
    Regex regexObj = new Regex(@"^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$");
    if (tag.Attributes.TryGetValue("href", out value))
    {
        string value2;
        //Start finding matches...
        Match matchResults = regexObj.Match(value);
        value2 = matchResults.Value;
            lstPages.AppendText(value2 + "\r\n");                        
    }
}

Чтобы исправить это, я добавил следующий код, и он работает для очистки списка:

if (value2 != "")
{
    lstPages.AppendText(value2 + "\r\n");
}

Однако я

  1. Не делаюЯ не верю, что это самый эффективный способ сделать это, и
  2. Все еще не понимает, откуда берутся строки != "".

Мой актуальный вопрос по обоим вопросам, но больше к вопросу № 2, так как я хотел бы узнать, почему я получаю эти результаты, но также и есть ли более эффективный метод для этого.

Ответы [ 3 ]

2 голосов
/ 06 июня 2011

Используйте Html Agility Pack вместо

static void Main(string[] args)
{
    var html = new HtmlDocument();
    var request = WebRequest.Create("/6592726/razbor-ssylok-i-poluchenie-lishnih-probelov") as HttpWebRequest;
    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    {
        html.Load(responseStream);
    }

    foreach (var absoluteHref in html.DocumentNode.SelectNodes("//a[starts-with(@href, 'http')]"))
    {
        Console.WriteLine(absoluteHref.Attributes["href"].Value);
    }
}
2 голосов
/ 07 июня 2011

Причина, по которой вы получаете пустую строку в value2, заключается в том, что matchResults.Value == "", если регулярное выражение не соответствует. Вместо проверки, если value2 != "", вы можете напрямую проверить matchResults.Success, чтобы увидеть, соответствует ли регулярное выражение. Во всяком случае, вы делаете это, так как ваше конкретное регулярное выражение никогда не будет соответствовать пустой строке, но проверка matchResults.Success будет более простой.

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

//A REGEX value, this one finds proper http address'
Regex regexObj = new Regex(@"^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$");
while (parse.ParseNext("a", out tag))
{
    string value;

    if (tag.Attributes.TryGetValue("href", out value))
    {
        string value2;
        //Start finding matches...
        Match matchResult = regexObj.Match(value);
        if (matchResult.Success)
        {
            value2 = matchResult.Value;
            lstPages.AppendText(value2 + "\r\n");
        }
    }
}
0 голосов
/ 06 июня 2011

TryGetValue - это общий метод (из Type T). Если он не имеет никакого значения для возврата, он возвращает default value of the type, что String.Empty или "" для String

...