解析链接和接收额外空白

本文关键字:空白 链接 | 更新日期: 2023-09-27 17:58:27

我解析网页的http链接,首先解析出所有锚定的标签,然后解析出href标签,然后运行regex来删除所有非独立链接的标签(如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");
}

然而,I

  1. 不要相信这是最有效的方法
  2. 仍然不明白!= ""行是从哪里来的

我的实际问题是这两个问题,但更多的是关于第2个问题,因为我想了解为什么我会收到这些结果,以及是否有更有效的方法。

解析链接和接收额外空白

如果正则表达式不匹配,则在value2中获得空字符串的原因是matchResults.Value == ""。您可以直接检查matchResults.Success来查看正则表达式是否匹配,而不是检查value2 != ""。无论如何,您基本上是在这样做的,因为您的特定正则表达式永远不会与空字符串匹配,但检查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");
        }
    }
}

使用Html敏捷包代替

static void Main(string[] args)
{
    var html = new HtmlDocument();
    var request = WebRequest.Create("http://stackoverflow.com/questions/6256982/parsing-links-and-recieving-extra-blanks/6257328#6257328") 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);
    }
}

TryGetValue是(Type T的)一个泛型方法。如果没有任何要返回的值,则返回default value of the type,即字符串的String.Empty""