单击我的button1时,它将运行
MatchCollection matchCollection = new Regex(@"(?<=/>)\d+").Matches(new StreamReader(((HttpWebResponse)((HttpWebRequest)WebRequest.Create("http://www.proxyserverlist24.top/feeds/posts/default")).GetResponse()).GetResponseStream()).ReadToEnd());
基本上,它将转到http://www.proxyserverlist24.top/feeds/posts/default并尝试提取/%gt;之间的数字;和lt; br
/%gt;103.12.161.1:65103%lt;br /%gt;103.16.61.134:8080%lt;br /%gt;103.21.77.106:8080%lt;br
我该如何获取这些数字?
无需正则表达式。您可以使用xml解析器(您的链接返回xml)和html解析器(HtmlAgilityPack)来解析“ content”标签的文本。所以最终的代码是:
IPAddress tempip;
int port;
List<IPEndPoint> proxies = null;
using (var client = new HttpClient())
{
var doc = new HtmlAgilityPack.HtmlDocument();
XNamespace ns = "http://www.w3.org/2005/Atom";
var xml = await client.GetStringAsync("http://www.proxyserverlist24.top/feeds/posts/default");
var xDoc = XDocument.Parse(xml);
proxies = xDoc.Descendants(ns + "entry")
.Select(x => (string)x.Element(ns + "content"))
.SelectMany(x =>
{
doc.LoadHtml(x);
return doc.DocumentNode.SelectNodes("//span[not(span)]")
.SelectMany(n => n.Descendants())
.Select(n => n.InnerText.Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
.Where(n => n.Length == 2)
.Where(n => IPAddress.TryParse(n[0], out tempip))
.Where(n => int.TryParse(n[1], out port))
.Select(n => new IPEndPoint(IPAddress.Parse(n[0]), int.Parse(n[1])));
})
.ToList();
}
实际上,也可以使用更短的regex解决方案,但是使用regex解析注释中提到的xml或html并不是一个好主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句