如何使用Tokenizer解析WhoIs数据?请求示例代码
使用Tokenizer解析WHOIS数据的示例方案
我看你已经成功抓取到了WHOIS原始数据,但在Tokenizer的模式定义上有点小问题,咱们来一步步调整,实现正确的解析。
首先,你需要先定义一个和WHOIS数据字段对应的实体类,用来存储解析后的结果:
public class WhoisRecord { public string DomainName { get; set; } public string RegistryDomainId { get; set; } public DateTime? UpdatedDate { get; set; } public DateTime? CreationDate { get; set; } public DateTime? ExpirationDate { get; set; } public string Registrar { get; set; } public string RegistrantOrganization { get; set; } public string RegistrantCountry { get; set; } public List<string> DomainStatuses { get; set; } = new List<string>(); public List<string> NameServers { get; set; } = new List<string>(); public string DnsSec { get; set; } }
接下来是Tokenizer的核心:正确的模式定义。WHOIS数据是每行键: 值的格式,对于重复出现的字段(比如Domain Status、Name Server),我们需要用[]来标记数组类型的匹配:
var pattern = @" Domain Name: {DomainName} Registry Domain ID: {RegistryDomainId} Updated Date: {UpdatedDate:yyyy-MM-ddTHH:mm:sszzz} Creation Date: {CreationDate:yyyy-MM-ddTHH:mm:sszzz} Registrar Registration Expiration Date: {ExpirationDate:yyyy-MM-ddTHH:mm:sszzz} Registrar: {Registrar} Registrant Organization: {RegistrantOrganization} Registrant Country: {RegistrantCountry} Domain Status: {DomainStatuses[]} Name Server: {NameServers[]} DNSSEC: {DnsSec} ";
这里要注意:
- 日期字段需要指定格式,和WHOIS里的日期格式匹配,Tokenizer会自动转换为
DateTime?类型 - 重复的字段(比如多个Domain Status)用
{字段名[]}来表示数组,解析后会自动存入List集合
然后把你的代码整合起来,完整的示例如下:
// 假设你已经获取到了WHOIS原始数据 var result = await WhoisClient.QueryAsync("google.com"); string rawWhois = result.Raw; // 初始化Tokenizer var tokenizer = new Tokenizer(); // 定义模式和实体类 var pattern = @" Domain Name: {DomainName} Registry Domain ID: {RegistryDomainId} Updated Date: {UpdatedDate:yyyy-MM-ddTHH:mm:sszzz} Creation Date: {CreationDate:yyyy-MM-ddTHH:mm:sszzz} Registrar Registration Expiration Date: {ExpirationDate:yyyy-MM-ddTHH:mm:sszzz} Registrar: {Registrar} Registrant Organization: {RegistrantOrganization} Registrant Country: {RegistrantCountry} Domain Status: {DomainStatuses[]} Name Server: {NameServers[]} DNSSEC: {DnsSec} "; // 解析数据 var whoisRecord = tokenizer.Parse<WhoisRecord>(pattern, rawWhois); // 测试输出 MessageBox.Show($"Domain Name: {whoisRecord.DomainName}"); MessageBox.Show($"Creation Date: {whoisRecord.CreationDate?.ToString("yyyy-MM-dd")}"); MessageBox.Show($"Registrar: {whoisRecord.Registrar}"); // 输出所有域名状态 foreach (var status in whoisRecord.DomainStatuses) { MessageBox.Show($"Domain Status: {status}"); }
关键注意点
- 模式里的每行要和WHOIS原始数据的行格式完全匹配,包括空格和标点,比如
Domain Name:后面的空格不能少 - 对于不需要解析的字段,可以直接在模式里省略,Tokenizer会忽略它们
- 如果某些字段可能不存在,对应的实体类属性要设为可空类型(比如
DateTime?)或者给默认值
内容的提问来源于stack exchange,提问作者nav
相关产品推荐
相关产品推荐

