C# 检查与C匹配的子体

C# 检查与C匹配的子体,c#,regex,filtering,html-agility-pack,C#,Regex,Filtering,Html Agility Pack,我正在做一个项目,在这个项目中,我基本上使用html agility pack从网页中抓取内容,直到使用下面的代码获得所需的点头 foreach (HtmlNode tr in bodyNode.SelectNodes("//tr")){ //tr.Descendants("span").Where(n => n.InnerHtml.Contains("display:none")).ToList(). //ForEach(n => n.Remove()); ; }

我正在做一个项目,在这个项目中,我基本上使用html agility pack从网页中抓取内容,直到使用下面的代码获得所需的点头

foreach (HtmlNode tr in bodyNode.SelectNodes("//tr")){
    //tr.Descendants("span").Where(n => n.InnerHtml.Contains("display:none")).ToList().
    //ForEach(n => n.Remove()); ;
}
因此,在每次循环之后,我都会得到与我在下面粘贴的内容类似的html内容

我需要做的是检查节点是否匹配。基本上我需要移除

<span style="display:none">what ever value here</span>
div style="display:none">what ever value here</div>
以及其他一些具有不同ID和类名的div和span。但是我上面写的代码似乎让我失望,因为它删除了整个nod,而没有只删除标记中的内容并标记它自己

如果有专家能帮助我,我将非常感激。我还是一个学习C语言的学生,所以如果代码不完美,我很抱歉。
谢谢。

如果要提取内容,只需使用

"//tr//span[contains(@style, 'display:none')]/text()"
类似地,对于具有特定id或类属性的范围

"//tr//span[@id='123']/text()"

如果您愿意,可以将所有这些条件结合起来

"//tr//span[contains(@style, 'display:none') or @id='123' or contains(@class, 'cl17')]/text()"

正如你所说。。。你得耍些花招

foreach (var tr in doc.DocumentNode.SelectNodes("//tr")) {
    var style = tr.SelectSingleNode(".//style");
    //Find the classes and ids with {display:none}
    var matches = Regex.Matches(style.InnerText, @"(\.|#)(.+?)\s*{\s*display\s*:\s*none");

    //Here we will store the classes & ids we'll need to remove
    List<string> classes = new List<string>();
    List<string> ids = new List<string>();

    //Storing the ids and classes
    foreach (Match m in matches) {
        var type = m.Groups[1].Value;
        if (type == ".")
        {
            classes.Add(m.Groups[2].Value);
        }
        else {
            ids.Add(m.Groups[2].Value);
        }
    }

    foreach (var n in tr.SelectNodes(".//*")) {
        if (Remove(n, classes, ids)) {
            n.Remove();
        }
    }

    var proxy = tr.SelectSingleNode("./td[2]/span").InnerText;
    var port = tr.SelectSingleNode("./td[3]").InnerText.Trim('\r', '\n', ' ');
}

你到底想从上面的代码中提取什么?在看到巴西和High+KA时,您似乎试图解析某些页面中的代理,但我在您的代码中找不到代理和端口。@OscarMederos:这很棘手,请尝试删除所有“无显示”元素。你得到了代理和端口:dw你发布的HTML的代理和端口是什么?请检查下面的答案。谢谢,代码很完美,但我们需要提取标记中的内容并搜索它们以显示:none属性并删除带有匹配类或id的span和div。完整源代码:谢谢。我制作了一个函数,等待您的解决方案。非常感谢:-。非常感谢。@DriverBoy对未来的建议是:试着找出你的问题到底是什么,什么不起作用,然后问这个问题。然后,根据答案,试着解决你的问题。我的观点是:不要期望在将来收到像我这样的完整的工作答案,因为它并没有真正帮助你,尽管你认为它有帮助。给一个人一条鱼,你就喂他一天。教一个人钓鱼,你就可以养活他一辈子;我明白了,我从来没有期望有人发布完整的答案,但谢谢你,我真的很感谢你这么做。当我试图归档一些东西时遇到困难,而社区一直在帮助我时,我才会在SOF上发布一个问题。谢谢你,奥斯卡,谢谢你的解决方案。
foreach (var tr in doc.DocumentNode.SelectNodes("//tr")) {
    var style = tr.SelectSingleNode(".//style");
    //Find the classes and ids with {display:none}
    var matches = Regex.Matches(style.InnerText, @"(\.|#)(.+?)\s*{\s*display\s*:\s*none");

    //Here we will store the classes & ids we'll need to remove
    List<string> classes = new List<string>();
    List<string> ids = new List<string>();

    //Storing the ids and classes
    foreach (Match m in matches) {
        var type = m.Groups[1].Value;
        if (type == ".")
        {
            classes.Add(m.Groups[2].Value);
        }
        else {
            ids.Add(m.Groups[2].Value);
        }
    }

    foreach (var n in tr.SelectNodes(".//*")) {
        if (Remove(n, classes, ids)) {
            n.Remove();
        }
    }

    var proxy = tr.SelectSingleNode("./td[2]/span").InnerText;
    var port = tr.SelectSingleNode("./td[3]").InnerText.Trim('\r', '\n', ' ');
}
//Remove the ones that have {display:none}, and the ones with the ids & classes provided.
static bool Remove(HtmlNode x, IList<string> classes, IList<string> ids) {
    var classAttr = x.GetAttributeValue("class", "");
    var idAttr = x.GetAttributeValue("id", "");
    return (x.Name == "span" && x.GetAttributeValue("style", "") == "display:none") ||
           (x.Name == "div" && x.GetAttributeValue("style", "") == "display:none") ||
           (x.Name == "span" && classes.Contains(classAttr)) ||
           (x.Name == "div" && classes.Contains(classAttr)) ||
           (x.Name == "span" && ids.Contains(idAttr)) ||
           (x.Name == "id" && ids.Contains(idAttr)) ||
           (x.Name == "style");
}
190.199.36.220:8080
177.139.137.107:3128
103.247.23.90:8080
222.124.130.203:8080
14.140.241.242:8080
175.103.37.10:8080
110.77.183.113:3128
54.243.51.203:8118
200.90.179.90:8080
213.152.173.137:8080
187.17.212.162:8080
62.201.207.14:8080
77.123.76.178:8080
189.76.212.254:3128
89.218.224.234:9090
221.179.173.170:8080
187.84.56.42:3128
118.99.79.13:8080
211.86.157.110:3128
189.38.3.122:3128
2.135.238.178:9090
2.135.238.2:9090
122.50.38.128:3128
217.11.185.251:3128
82.200.254.2:9090
37.59.82.253:8080
83.111.38.131:3128
85.118.227.76:3128
182.30.249.13:8080
124.88.154.3:6673
111.13.87.150:80
190.85.37.90:8080
219.117.232.133:3128
211.100.47.138:8990
46.32.21.195:8080
107.18.121.126:8080
118.97.191.203:8080
119.195.32.211:3128
2.133.92.242:9090
202.164.217.18:8080
222.124.214.194:3128
79.140.17.253:3128
61.138.104.30:1080
201.45.116.138:3128
190.98.209.168:3128
190.204.222.183:8080
200.199.173.122:3128
197.159.16.58:8080
223.4.233.164:3128
212.93.195.229:3128