【问题标题】:How to getelement by class?如何按类获取元素?
【发布时间】:2019-06-26 10:17:09
【问题描述】:

我正在尝试编写一种使用 webBrowser1 通过 href 获取下载链接的方法,但问题是我必须使用它的类名找到它。

<body>
<iframe scrolling="no" frameborder="0" allowtransparency="true" tabindex="0" name="twttrHubFrame" style="position: absolute; top: -9999em; width: 10px; height: 10px;" src="http://platform.twitter.com/widgets/hub.html">
‌¶
<div id="main">
‌¶‌→
<div id="header">
<div style="float:left;">
‌¶‌→
<div id="content">
‌¶‌→
<h1 style="background-image:url('http://static.mp3skull.com/img/bgmen.JPG'); background-repeat:repeat-x;">Rush‌·Mp3‌·Download</h1>
‌¶‌→
<a id="bitrate" onclick="document.getElementById('ofrm').submit(); return false;" rel="nofollow" href="">
<form id="ofrm" method="POST" action="">
‌¶‌→‌¶‌→‌→
<div id="song_html" class="show1">
‌¶‌→‌→‌→
<div class="left">
‌¶‌→‌→‌→
<div id="right_song">
‌¶‌→‌→‌→‌→
<div style="font-size:15px;">
‌¶‌→‌→‌→‌→
<div style="clear:both;"></div>
‌¶‌→‌→‌→‌→
<div style="float:left;">
‌¶‌→‌→‌→‌→‌→
<div style="float:left; height:27px; font-size:13px; padding-top:2px;">
‌¶‌→‌→‌→‌→‌→‌→
<div style="float:left; width:27px; text-align:center;">
‌¶‌→‌→‌→‌→‌→‌→
<div style="margin-left:8px; float:left;">
<a style="color:green;" target="_blank" rel="nofollow" href="http://dc182.4shared.com/img/1011303409/865387c9/dlink__2Fdownload_2F6QmedN8H_3Ftsid_3D20111211-54337-a79f8d10/preview.mp3">Download</a>
</div>
‌·‌¶‌→‌→‌→‌→‌→‌→
<div style="margin-left:8px; float:left;">
‌¶‌→‌→‌→‌→‌→‌→
<div style="margin-left:8px; float:left;">
‌·‌¶‌→‌→‌→‌→‌→‌→
<div style="clear:both;"></div>
‌¶‌→‌→‌→‌→‌→
</div>
‌¶‌→‌→‌→‌→‌→
<div id="player155580779" class="player" style="float:left; margin-left:10px;"></div>
‌¶‌→‌→‌→‌→
</div>
‌→‌¶‌→‌→‌→‌→
<div style="clear:both;"></div>
‌¶‌→‌→‌→
</div>
‌¶‌→‌→‌→
<div style="clear:both;"></div>
‌¶‌→‌→
</div>

我在 google 上找遍了,但我找到了 PHP 示例?

我知道你会这样做

HtmlElement downloadlink = webBrowser1.Document.GetElementById("song_html").All[0];
URL = downloadlink.GetAttribute("href");

但我不明白“show1”类如何做到这一点。

请通过示例和/或我可以访问的网站为我指明正确的方向,这样我就可以在搜索时学习如何执行此操作并且不知道。

编辑:我非常需要 href 链接(“http://dc182.4shared.com/img/1011303409/865387c9/dlink__2Fdownload_2F6QmedN8H_3Ftsid_3D20111211-54337-a79f8d10/preview.mp3”),那么我该如何获得它?

【问题讨论】:

  • “show1”和“webBrowser1”从何而来?如果您使用示例代码或库,请包含该信息。
  • show1 是我在上面发布的 HTML 代码中的类名。 webBrowser1 就是我用来通过表单访问网页的工具。

标签: c# webbrowser-control


【解决方案1】:

WebBrowser 控件中没有内置任何内容来按类名检索元素。既然您知道这将是一个 a 元素,那么您能做的最好的事情就是获取所有 a 元素并搜索您想要的:

var links = webBrowser1.Document.GetElementsByTagName("a");
foreach (HtmlElement link in links)
{
    if (link.GetAttribute("className") == "show1")
    {
        //do something
    }
}

【讨论】:

  • 所以你说的是这段代码,它会找到类名“show1”,然后我可以从那里使用 getattribute of href 检索 URL?
  • 是的 - 它会找到所有类名为“show1”的a元素,然后您可以像以前一样使用link.GetAttribute("href")检索链接
  • 由于某种原因它不会检索 URL?这会有什么原因吗?浏览 HTML 后,它都在一个名为“内容”的 id 下,所以我必须先搜索它吗?
    我试过类似的东西; var links = webBrowser1.Document.GetElementById("content").Document.GetElementsByTagName("a");但它给了我一个错误
  • 你能用包含你的链接的相关html更新你的问题吗?
  • @BrokenGlass 它应该是 classname 而不是类。 social.msdn.microsoft.com/Forums/vstudio/en-US/…
【解决方案2】:

HtmlDocument 的扩展方法

返回带有特定标签的元素列表,该标签与给定的类名一致

它可以用于仅捕获标签上的元素,或者仅通过类名来捕获元素

internal static class Utils
{
  internal static List<HtmlElement> getElementsByTagAndClassName(this HtmlDocument doc, string tag = "", string className = "")
  {
      List<HtmlElement> lst = new List<HtmlElement>();
      bool empty_tag = String.IsNullOrEmpty(tag);
      bool empty_cn = String.IsNullOrEmpty(className);
      if (empty_tag && empty_cn) return lst;
      HtmlElementCollection elmts = empty_tag ? doc.All : doc.GetElementsByTagName(tag);
      if (empty_cn)
      {
         lst.AddRange(elmts.Cast<HtmlElement>());
         return lst;
      }
      for (int i = 0; i < elmts.Count; i++)
      {
         if (elmts[i].GetAttribute("className") == className)
         {
            lst.Add(elmts[i]);
         }
      }
      return lst;
   }
}

用法:

WebBrowser wb = new WebBrowser();
List<HtmlElement> lst_div = wb.Document.getElementsByTagAndClassName("div");// all div elements
List<HtmlElement> lst_err_elmnts = wb.Document.getElementsByTagAndClassName(String.Empty, "error"); // all elements with "error" class
List<HtmlElement> lst_div_err = wb.Document.getElementsByTagAndClassName("div", "error"); // all div's with "error" class

【讨论】:

  • 对我来说很完美。谢谢。
【解决方案3】:

我跟进了这些答案,并制定了按类名隐藏 div 的方法。

我为谁担心。

public void HideDivByClassName(WebBrowser browser, string classname)
        {
            if (browser.Document != null)
            {
                var byTagName = browser.Document.GetElementsByTagName("div");
                foreach (HtmlElement element in byTagName)
                {
                    if (element.GetAttribute("className") == classname)
                    {
                        element.Style = "display:none";
                    }
                }
            }
        }

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签