3 回答

TA贡献1818条经验 获得超3个赞
第一种方法
如果您想要 AreaCode 的整个对象,请先尝试方法。
public List<AreaCode> GetAllAreaCodes(string htmlString)
{
List<AreaCode> areraCodes = new List<AreaCode>();
Regex rgxAttr = new Regex(@"data-react-props=""{(.*?)}""");
Regex rgxValue = new Regex(@"""{(.*?)}""");
var attrResult = rgxAttr.Matches(htmlString);
List<string> attrValues = new List<string>();
foreach (Match match in attrResult)
{
var val = rgxValue.Match(match.Value);
attrValues.Add(val.Value.Replace("\"{", "{").Replace("}\"", "}"));
}
foreach (var item in attrValues)
{
JavaScriptSerializer js = new JavaScriptSerializer();
var dn = js.Deserialize<dynamic>(item) as Dictionary<string, object>;
if (dn != null && dn.ContainsKey("areaCodes"))
{
var abc = item.Remove(item.Length - 1, 1).Remove(0, 1).Replace(@"""areaCodes"":", "");
areraCodes = js.Deserialize<List<AreaCode>>(abc);
}
}
return areraCodes;
}
public class AreaCode
{
public string phone_prefix { get; set; }
public string location { get; set; }
public string href { get; set; }
public string[] details { get; set; }
}
第二种方法
如果您只需要 href 值,则使用第二种方法。
public List<string> GetAllHref(string htmlString)
{
List<string> hrefList = new List<string>();
Regex rgxAttr = new Regex(@"data-react-props=""{(.*?)}""");
Regex rgxValue = new Regex(@"""{(.*?)}""");
var attrResult = rgxAttr.Matches(htmlString);
List<string> attrValues = new List<string>();
foreach (Match match in attrResult)
{
var val = rgxValue.Match(match.Value);
attrValues.Add(val.Value.Replace("\"{", "{").Replace("}\"", "}"));
}
dynamic ob = null;
foreach (var item in attrValues)
{
JavaScriptSerializer js = new JavaScriptSerializer();
var dn = js.Deserialize<dynamic>(item) as Dictionary<string, object>;
if (dn != null && dn.ContainsKey("areaCodes"))
ob = dn["areaCodes"];
}
var s = ob as Array;
foreach (Dictionary<string, object> item in s)
hrefList.Add(item["href"].ToString());
return hrefList;
}

TA贡献1828条经验 获得超6个赞
您下载的文件不是有效的 HTML,因为它是 React 视图。因此,HTMLAgilityPack 之类的工具对您的帮助不大。
您可以尝试使用诸如WebKit.NET 之类的无头浏览器,看看您是否有运气。在构建最终 HTML 的过程中,您可能可以在某处插入。
除此之外,我能想到的唯一选择是使用正则表达式从文件中获取所需的数据。例如:
var regex = new Regex(@"(?<=data-react-props=""){.*}(?=<)");
var match = regex.Match(pageContents);
if (match.Success)
{
foreach (var gr in match.Groups)
{
Console.WriteLine(gr);
}
}
- 3 回答
- 0 关注
- 94 浏览
添加回答
举报