Anglesharp在DoClick()之后获取节点文本

时间:2019-02-28 11:05:41

标签: c# parsing web-scraping anglesharp

我有一个HTML代码:

<div class="contact-button link-phone {'path':'phone', 'id':'gtziy', 'id_raw': '243468578'} atClickTracking contact-a"
data-rel="phone">
    <i data-icon="phone"></i>
    <strong class="xx-large">HIDDEN TEXT HERE</strong>
    <span class="spoiler">SHOW</span>
</div>

我正在使用以下代码获取div:

IHtmlElement nodeToClick = (IHtmlElement)document.All.First(m =>
                    m.HasAttribute("class") &&
                    m.ClassList.Contains("contact-button") &&
                    m.HasAttribute("data-rel") &&
                    m.GetAttribute("data-rel") == "phone");

然后我使用DoClick()单击节点:

nodeToClick.DoClick();

div的HTML代码应更改为此:

<div class="contact-button link-phone {'path':'phone', 'id':'gtziy', 'id_raw': '243468578'} atClickTracking contact-a activated"
data-rel="phone">
    <i data-icon="phone"></i>
    <strong class="xx-large">TEXT HERE</strong>
    <span class="spoiler" style="display: none;">SHOW</span>
</div>

但是nodeToClick.TextContent返回的值与nodeToClick.DoClick()之前相同。

我尝试做的事情:

  • 在记录“ nodeToClick.TextContent”之前插入延迟Thread.Sleep(2000)
  • 延迟2秒后重写nodeToClick而不更新页面
  • 使用以下代码重新加载页面的HTML:

    public static string GetHTML(string url)
    {
            HttpWebRequest proxy_request = (HttpWebRequest)WebRequest.Create(url);
    
            proxy_request.Method = "GET";
            proxy_request.ContentType = "application/x-www-form-urlencoded";
            proxy_request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.89 Safari/532.5";
            proxy_request.KeepAlive = true;
    
            HttpWebResponse resp = proxy_request.GetResponse() as HttpWebResponse;
            string html = "";
            using (StreamReader sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
            {
                html = sr.ReadToEnd();
                sr.Close();
            }
    
            resp.Close();
    
            html = html.Trim();
    
            return html;
        }
    

但是这些都不适合我

如何获取单击的元素的新TextContent?

1 个答案:

答案 0 :(得分:1)

我很困惑为什么单击div时会发生任何事情。您缺少要发布的是AngleSharp配置。

我认为您猜想AngleSharp附带了JS支持-事实并非如此。 AngleSharp本身只是浏览器引擎的核心-它具有所有连接点和最基本的功能,例如HTML5解析器。还有另一个提供JS支持的库-但它的基础/实验性很强,可能不适用于您的情况。

我还要假设,因为您正在以自己的代码下载HTML,所以JS仍然无法正常工作(您需要像浏览器一样使用AngleSharp-浏览器也不提供HTML,但是URL却提供了HTML其余的-与AngleSharp相同,这里使用的东西称为BrowsingContext)。

长话短说。您不能只单击静态的东西而期望动态的东西发生。另外,您应该仔细阅读documentation of AngleSharp-我想它可能会有所帮助。

HTH!