Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用agility pack解析html_C#_Html_Parsing_Html Agility Pack - Fatal编程技术网

C# 使用agility pack解析html

C# 使用agility pack解析html,c#,html,parsing,html-agility-pack,C#,Html,Parsing,Html Agility Pack,我有一个html要解析(见下文) 有人能告诉我怎么做吗?基本上,我想做的是从html中获取上述标记中的所有电子邮件地址和链接 foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]")) { HtmlAttribute att = link.Attributes["onclick"]; Console.WriteLine(att.Value); } 编辑:我需要成对地将解析后的值存储在类(列表

我有一个html要解析(见下文)

有人能告诉我怎么做吗?基本上,我想做的是从html中获取上述标记中的所有电子邮件地址和链接

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]"))
{
    HtmlAttribute att = link.Attributes["onclick"];
    Console.WriteLine(att.Value);
}
编辑:我需要成对地将解析后的值存储在类(列表)中。电子邮件(链接)和发件人电子邮件

public class ClassMailBox
{
    public string From { get; set; } 
    public string LinkToMail { get; set; }    

}

您可以编写以下代码:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(responseFromServer);

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]"))
{
    HtmlAttribute att = link.Attributes["onclick"];
    ClassMailBox classMailbox = new ClassMailBox() { LinkToMail = att.Value };
    classMailBoxes.Add(classMailbox);
}

int currentPosition = 0;

foreach (HtmlNode tableDef in doc.DocumentNode.SelectNodes("//tr[@onclick]/td[1]"))
{
    classMailBoxes[currentPosition].From = tableDef.InnerText;
    currentPosition++;
}
为了使代码保持简单,我假设:

  • 电子邮件始终位于tr中包含onlink属性的第一个td上
  • 每个具有onlink属性的tr都包含一封电子邮件

  • 如果这些条件不适用,此代码将无法工作,并且可能引发一些异常(IndexOutOfRangeExceptions)或者它可能会将链接与错误的电子邮件地址相匹配。

    我也尝试过HtmlAgilityPack,但它不太支持XPath。您尝试过CssPath功能吗?@Tagyoureit我尝试过您的代码,它会打印两个tr项:location='readmail.html?mid=welcome'location='readmail.html?mid=T0wM6P'我正在使用.NET 4.5和HtmlAgilityPack 1.4.9。请检查responseFromServer变量中的html是否完整。谢谢你是对的,我在分析过时的HTML。下一个问题是如何获取发件人电子邮件地址?好的,我可以通过创建包含第一个td子项的第二个Xpath来获取电子邮件,您想在同一个查询上为td和tr创建Xpath,还是更喜欢为查询创建Xpath,并为td创建另一个Xpath,我建议这样做。是的,它非常有效。谢谢你抽出时间!你的假设是正确的(1和2)。
    public class ClassMailBox
    {
        public string From { get; set; } 
        public string LinkToMail { get; set; }    
    
    }
    
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(responseFromServer);
    
    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]"))
    {
        HtmlAttribute att = link.Attributes["onclick"];
        ClassMailBox classMailbox = new ClassMailBox() { LinkToMail = att.Value };
        classMailBoxes.Add(classMailbox);
    }
    
    int currentPosition = 0;
    
    foreach (HtmlNode tableDef in doc.DocumentNode.SelectNodes("//tr[@onclick]/td[1]"))
    {
        classMailBoxes[currentPosition].From = tableDef.InnerText;
        currentPosition++;
    }