无法获取网络浏览器文档

时间:2016-02-12 13:22:34

标签: c# html webbrowser-control

我正在从WinForms-Application做一些webscraping。这是我想从中删除的浏览器文档的片段:

<div class="div1" id="id1" data-on-choice="asdf">
<h4>Target:</h4>                                                            
<table class="table1" style="width: 100%;">
    <tbody><tr>
        <td>
            <div class="div2">
                <label>aa</label>
                <label>ab</label>
                <label>ac</label>
            </div>                                                                  
            <div class="div3" id="id2">
                <span class="span1" role="status" aria-live="polite"></span>
            </div>
            <a class="anchor1" style="display: inline;" href="#"></a>                       
        </td>
    </tr>
    <tr>
        <td>
            <div class="div4">
                <span></span>
                <span></span>
                <span></span>
            </div>
        </td>
    </tr>
</tbody></table>

我想要获得并点击的HtmlElement将成为锚点#34; anchor1&#34;。请注意,我已经做了很多次类似的事情,但我似乎无法得到这个特殊的元素。即使我打印文档中所有锚元素的InnerHtml,也没有这个元素的行。

Html-Agility-Pack不是一个选项,因为我的应用程序太大而无法重新编码。 html不在我的控制之下,所以将id分配给元素,......也不是一个选项。

在我看来,这应该可以解决问题,但它不起作用:

HtmlElement elementToClick = browser.Document.GetElementsByTagName("a")
         .Cast<HtmlElement>()
         .FirstOrDefault(m => m.GetAttribute("class") == "anchor1");
elementToClick.InvokeMember("click");

2 个答案:

答案 0 :(得分:3)

由于class是一个特殊名称,因此它不返回该值。您应该使用 className 。下面的代码段为我工作:

var elementToClick = browser.Document
            .GetElementsByTagName("a")
            .Cast<HtmlElement>()
            .FirstOrDefault(m => m.GetAttribute("className") == "anchor1");

答案 1 :(得分:0)

您可以通过调用这样的javascript来调用点击所需的 a 标记:

browser.InvokeScript("document.querySelector('a.anchor1').click()");

您调用的脚本将在您的Web浏览器控件上加载的Web文档上运行。

有关InvokeScript的更多信息,请参阅 WebBrowser.InvokeScript Method