AngleSharp - 如何浏览其链接触发表单提交的网站
AngleSharp - How to browse website whose links trigger form submission
我正在尝试从该网站的多个搜索结果页面中抓取 "Read More" link:https://www.cgg.com/en/31
搜索结果的任何特定页面都没有规范 link。当您导航到第 2 页时,URL 仍然是 https://www.cgg.com/en/31。
检查基础 HTML 和 JavaScript 后,我发现分页 link 在单击时会触发 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,但内容不同。
我想在单击 "NEXT" 按钮后从下一页抓取 "Read More" link。我如何使用 AngleSharp 执行此操作,因为单击 "NEXT" 按钮实际上会提交表单并重新加载页面?
这是我目前的情况:https://dotnetfiddle.net/3f6XZC
这里有两个可能的答案:
- 您需要 JavaScript(例如,AngleSharp.JavaScript,最新版本的 AngleSharp 尚不可用)并且需要通过 "clicking" link 触发 JavaScript.
(这个行不通 - 至少现在 - 如前所述)
- (我想这就是您所追求的 - 从您的部分问题来看)您将需要在 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();
}
希望对您有所帮助!
我正在尝试从该网站的多个搜索结果页面中抓取 "Read More" link:https://www.cgg.com/en/31
搜索结果的任何特定页面都没有规范 link。当您导航到第 2 页时,URL 仍然是 https://www.cgg.com/en/31。
检查基础 HTML 和 JavaScript 后,我发现分页 link 在单击时会触发 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,但内容不同。
我想在单击 "NEXT" 按钮后从下一页抓取 "Read More" link。我如何使用 AngleSharp 执行此操作,因为单击 "NEXT" 按钮实际上会提交表单并重新加载页面?
这是我目前的情况:https://dotnetfiddle.net/3f6XZC
这里有两个可能的答案:
- 您需要 JavaScript(例如,AngleSharp.JavaScript,最新版本的 AngleSharp 尚不可用)并且需要通过 "clicking" link 触发 JavaScript.
(这个行不通 - 至少现在 - 如前所述)
- (我想这就是您所追求的 - 从您的部分问题来看)您将需要在 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();
}
希望对您有所帮助!