【问题标题】:How can i parse InnerText of <option> tag with HtmlAgilityPack?如何使用 HtmlAgilityPack 解析 <option> 标签的 InnerText?
【发布时间】:2012-12-21 01:22:59
【问题描述】:

上下文:

我正在尝试从 Page here 解析“城市”。我已经设法模拟了对这个组合框的数据请求,这是一个 Ajax 调用。

提琴手请求:

POST http://www.telelistas.net/AjaxHandler.ashx HTTP/1.1
Host: www.telelistas.net
Connection: keep-alive
Content-Length: 106
Origin: http://www.telelistas.net
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko)      Chrome/23.0.1271.97 Safari/537.11
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
Referer: http://www.telelistas.net/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: cert_Origin=directo; email=bdc.testes@gmail.com; auto=automatico=0; searchparameters=bottom=0&btnsite=0&email=&uf=rj&origem=0&nome=&pagina=1&codlogradouro=&predio=213&tiquete=0&localidadeendmap=&codbairro=0&pcount=25&estacionamento=0&letra=&top=&entrega=0&pchave=&info=&logradouro=rua+da+lapa&codtitulo=-1&chave=&zoom=&comercial=0&ddd=0&comib=0&btnemail=0&pgresultado=&localidade=&telefone=&manobrista=0&codlocalidade=21000&site=&cartoes=0&atividade=&bairro=&reserva=0&residencial=0; perfil=logged=1&iduser=2563063&email=bdc.testes@gmail.com&usertype=2&specialsearch=3&siteusernome=BigDataCorp&siteuserdatanasc=15/01/1988&siteusersexo=M&siteuserlocalidade=21000&siteuseruf=RJ&siteuserddd=21&siteusertelefone=94118439&siteuserprofissao=4&siteuserrenda=5000&siteuserformacao=4&siteusernovidades=0&siteusernovidadesrevista=&siteusernovidadesparceiros=0&siteusercpf=10541308769&siteuseracesso=brasil&siteusercep=22631000&siteuseridade=24&siteuserparceiro=telelistas&siteuserconhecimento=2&siteuseroperadora=oi&siteuserurlorigem=http://www.telelistas.net/&siteuserdatacadastro=13/12/2012 11:45:00; __utma=70879631.392027796.1355939587.1356014801.1356021821.5; __utmb=70879631.1.10.1356021821; __utmc=70879631; __utmz=70879631.1355939587.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

PostData : state=rj&style=busca_interna&selectedCity=21000&clientId=pch_localidade_select&method=GetSearchCitiesNamed

问题:

这是该请求返回的字符串片段:

<select name='pch_localidade_select' class='busca_interna' id='pch_localidade_select' tabindex="4"><option value="">Selecione</option><option selected value="21000">Rio de Janeiro</option><option value="21380">Abraão</option><option value="21001">Afonso Arinos</option><option value="21002">Agência Luterback</option><option value="21847">Agriões de Dentro</option>

我想要做的是到达选项标签的InnerText(“Rio de Janeiro”、“Abraao”...),但出于某种奇怪的原因,InnerText 总是空的,对于找到的每个选项节点。

有一些代码片段失败:

        // Iterating over nodes to build the dictionary
        foreach (HtmlNode city in citiesNodes)
        {
            string key   = city.InnerText;
            string value = city.Attributes["value"].Value;

            citiesHash.AddCity (key,value);
        }

技术到位:

我正在使用HtmlAgilityPack,它支持XPath 语法用于节点选择、C# 代码和Fiddler2 用于WebDebugging。

提前致谢

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

    在加载html之前使用HtmlAgilityPack.HtmlNode.ElementsFlags.Remove("option");

    HtmlAgilityPack.HtmlNode.ElementsFlags.Remove("option");
    
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    
    var options = doc.DocumentNode.Descendants("option").Skip(1)
                    .Select(n => new
                    {
                        Value = n.Attributes["value"].Value,
                        Text = n.InnerText
                    })
                    .ToList();
    

    【讨论】:

    • 这对我也有用,我应该删除我的答案还是保留这两个选项以供将来使用社区?
    • 我会留下它,但有时人们会不必要地否决答案。所以这是你的选择。
    【解决方案2】:

    由于一些奇怪的原因,HtmlAgilityPack 没有正确处理这些标签,所以这设法解决了我的问题。

            // Iterating over nodes to build the dictionary
            foreach (HtmlNode city in citiesNodes)
            {
                if (city.NextSibling != null)
                {
                    string key   = city.NextSibling.InnerText;
                    string value = city.Attributes["value"].Value;
    
                    citiesHash.AddCity (key,value);
                }
            }
    

    我没有直接到达节点,而是通过使用上一个模拟中的NextSimbling 引用来获取每个节点的值。

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 2015-11-10
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2013-03-05
      • 2012-08-28
      相关资源
      最近更新 更多