【问题标题】:Get innerText from <div class> with an <a href> child从 <div class> 获取带有 <a href> 子级的 innerText
【发布时间】:2023-07-12 07:22:01
【问题描述】:

我正在使用 C# 中的 webBrowser,我需要从链接中获取文本。该链接只是一个没有类的 href。

是这样的

<div class="class1" title="myfirstClass">
<a href="link.php">text I want read in C#
<span class="order-level"></span>

不应该是这样的吗?

        HtmlElementCollection theElementCollection = default(HtmlElementCollection);
        theElementCollection = webBrowser1.Document.GetElementsByTagName("div");
        foreach (HtmlElement curElement in theElementCollection)
        {
            if (curElement.GetAttribute("className").ToString() == "class1")
            {
                HtmlElementCollection childDivs = curElement.Children.GetElementsByName("a");
                foreach (HtmlElement childElement in childDivs)
                {
                    MessageBox.Show(childElement.InnerText);
                }

            }
        }

【问题讨论】:

  • 不知道这个类,但是与 HTML 相关的GetElementById 应该只检索具有该 ID 的 1 个元素,并且这些 ID 不能包含空格。我也没有在 HTML 中看到任何 ID
  • 我很好奇,你用什么服务器端语言来获取客户端 HTML 的内部文本?

标签: c# html web webrequest


【解决方案1】:

这是通过标签名称获取元素的方式:

String elem = webBrowser1.Document.GetElementsByTagName("div");

然后你应该提取href的值:

var hrefLink = XElement.Parse(elem)
     .Descendants("a")
     .Select(x => x.Attribute("href").Value)
     .FirstOrDefault();

如果你有超过 1 个“a”标签,你也可以放入一个 foreach 循环,如果这是你想要的。

编辑:

使用 XElement:

可以通过调用element.ToString()获取包括外层节点在内的内容。

如果要排除外层标签,可以调用String.Concat(element.Nodes())

使用HtmlAgilityPack获取innerHTML:

  1. NuGet 安装 HtmlAgilityPack。
  2. 使用此代码。

HtmlWeb web = new HtmlWeb();

HtmlDocument dc = web.Load("Your_Url");

var s = dc.DocumentNode.SelectSingleNode("//a[@name="a"]").InnerHtml;

希望对你有帮助!

【讨论】:

  • XElement.Parse(elem) 必须是一个字符串。我可以只转换 HTMLElement 吗?它抛出:System.Xml.dll 中发生了“System.Xml.XmlException”类型的未处理异常
  • 你可能可以在elem前面使用String而不是HtmlElement,我的借口。
  • 我是 xElement 的新手。 string htmlCode = @""; var elem = XElement.Parse(htmlCode) .Descendants("a") .Select(x => x.Attribute("href").Value) .FirstOrDefault(); MessageBox.Show(elem);但 mbox 是空的。我做错了什么?
  • MessageBox.Show(string.Format(hrefLink));?
  • 在 mscorlib.dll 中发生“System.ArgumentNullException”类型的未处理异常...结果为 null..?
【解决方案2】:

这里我创建了控制台应用程序来提取锚文本。

static void Main(string[] args)
        {
            string input = "<div class=\"class1\" title=\"myfirstClass\"><a href=\"link.php\">text I want read in C#<span class=\"order-level\"></span>";
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(input);
            foreach (HtmlNode item in doc.DocumentNode.Descendants("div"))
            {
                var link = item.Descendants("a").First();
                var text = link.InnerText.Trim();
                Console.Write(text);
            }
            Console.ReadKey();
        }

请注意这是htmlagilitypack 问题,因此请正确标记问题。

【讨论】:

  • 这行得通,但是当我阅读输入时,我得到了正常的 HTML 语法。有没有办法将其转换为正确的语法?喜欢: