Могу ли я извлечь некоторые данные из файла HTML, который я скачал, в нем есть JSON - PullRequest
0 голосов
/ 25 апреля 2019

Это ссылка на файл 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

Или есть какой-нибудь другой лучший способ получить значение href из этой HTML-страницы, которую я скачал?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

Файл, который вы скачали, не является допустимым 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);
    }
}
0 голосов
/ 25 апреля 2019

Первый подход

Если вам нужен весь объект 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;
}
0 голосов
/ 25 апреля 2019

Вы можете использовать библиотеки, такие как HTLMAgilityPack , чтобы проанализировать HTML-документ и затем извлечь JSON при необходимости.

...