0

我正在尝试从本网站的多个搜索结果页面中抓取“阅读更多”链接:https ://www.cgg.com/en/31

没有指向搜索结果的任何特定页面的规范链接。当您导航到第 2 页时,URL 仍然是https://www.cgg.com/en/31

在检查底层 HTML 和 JavaScript 后,我​​看到分页链接在单击时会触发 JavaScript 函数。

<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$ctl00$Layout-7-main-partial2$TmsPager1$ctl02$ctl00','')">NEXT</a>

这是被调用的函数:

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

因此,通过单击“NEXT”,浏览器将被重定向到相同的 URL,但内容不同。

单击“下一步”按钮后,我想从下一页抓取“阅读更多”链接。由于单击“下一步”按钮实际上会提交表单并重新加载页面,我将如何使用 AngleSharp 执行此操作?

这是我到目前为止所拥有的:https ://dotnetfiddle.net/3f6XZC

4

1 回答 1

1

这里有两个可能的答案:

  1. 您需要 JavaScript(例如,AngleSharp.JavaScript,它还不适用于最新版本的 AngleSharp),并且需要通过“单击”触发 JavaScript 的链接来触发表单提交。

(这个不起作用 - 至少现在 - 如前所述)

  1. (我想这就是你所追求的——从你的部分问题来看)你需要在 C# 中实现那个特定的 JS。由于 AngleSharp 为您提供了一个动态 DOM,您可以做到这一点。

特定代码在 C# 中如下所示(假设您还调用了您的document实例document):

Task SubmitForm(IDocument document, string eventTarget, string eventArgument)
{
    var theForm = document.Forms["form1"];

    if (!theForm) {
        throw new InvalidOperationException("The form cannot be found!");
    }

    void SetElement(string name, string value)
    {
        var element = theForm.Elements[name] as IHtmlInputElement;

        if (element != null)
        {
            element.value = value;
        }
    }

    SetValue("__EVENTTARGET", eventTarget);
    SetValue("__EVENTARGUMENT", eventArgument);
    return theForm.SubmitAsync();
}

希望有帮助!

于 2019-03-28T10:53:04.713 回答