AngleSharp - Как просматривать веб-сайт, ссылки которого вызывают отправку формы - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь очистить ссылки "Подробнее" с нескольких страниц результатов поиска на этом сайте: 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>

Итак, нажав «ДАЛЕЕ», браузер перенаправляется на тот же URL, но с другим содержимым.

Я бы хотел убрать ссылки "Подробнее" со следующей страницы после нажатия кнопки "СЛЕДУЮЩАЯ". Как бы я это сделал, используя AngleSharp, поскольку нажатие кнопки «NEXT» фактически отправляет форму и перезагружает страницу?

Вот что у меня есть: https://dotnetfiddle.net/3f6XZC

1 Ответ

1 голос
/ 28 марта 2019

Здесь есть два возможных ответа:

  1. Вам необходим JavaScript (например, AngleSharp.JavaScript, который пока недоступен для последней версии AngleSharp) и должен будет инициировать отправку формы с помощью«щелкнув» по ​​ссылке, которая запускает JavaScript.

(эта не будет работать - по крайней мере пока - как уже упоминалось)

(Полагаю, это тот, который вам нужен - судя по частям вашего вопроса) Вам нужно будет внедрить этот конкретный JS в C #.Поскольку 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();
}

Надеюсь, это поможет!

...