解析链接和接收额外空白
本文关键字:空白 链接 | 更新日期: 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
- 不要相信这是最有效的方法
- 仍然不明白
!= ""
行是从哪里来的
我的实际问题是这两个问题,但更多的是关于第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
或""