为了账号安全,请及时绑定邮箱和手机立即绑定

我可以从我下载的 HTML 文件中提取一些数据吗?它里面有一些 JSON

我可以从我下载的 HTML 文件中提取一些数据吗?它里面有一些 JSON

C#
交互式爱情 2022-12-31 10:30:40
这是我下载的 HTML 文件的链接https://drive.google.com/open?id=1z7A9U0qZSVtLMQDbsVtPyZVz9Zm73-ZQ从这个文件最后你可以看到一些这样的数据<div data-react-class="packs/v9/phone/containers/AreaCodeListing" data-react-props="{"areaCodes":[{"phone_prefix":"(202) 200","details":["Sprint"],"location":"Washington, DC","href":"/202-200"},{"phone_prefix":"(202) 201","details":["Verizon"],"location":"Washington, DC","href":"/202-201"},{"phone_prefix":"(202) 202","details":["General Service Carrier"],"location":"Washington, DC","href":"/202-202"},{"phone_prefix":"(202) 203","details":["T-Mobile"],"location":"Washington, DC","href":"/202-203"},{"phone_prefix":"(202) 204","details":["XO Communications"],"location":"Washington, DC","href":"/202-204"}我如何从这个页面提取href值?我认为JSON可以完成这项工作,但我被困在如何达到那个点以获得那个 json或者有没有其他最好的方法从我下载的这个 HTML 页面中获取href值?
查看完整描述

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;

}


查看完整回答
反对 回复 2022-12-31
?
狐的传说

TA贡献1804条经验 获得超3个赞

您可以使用HTLMAgilityPack等库来解析 HTML 文档,然后根据需要提取 JSON。



查看完整回答
反对 回复 2022-12-31
?
30秒到达战场

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);

    }

}


查看完整回答
反对 回复 2022-12-31
  • 3 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号