Content Transformation
內(nèi)容轉(zhuǎn)換腳本用于在從網(wǎng)頁中提取內(nèi)容后轉(zhuǎn)換內(nèi)容。內(nèi)容轉(zhuǎn)換通常用于HTML元素宿稀,以提取不放在單個元素中的信息愕难,因此不能在web瀏覽器中選擇。例如妻柒,內(nèi)容轉(zhuǎn)換可以用來從包含完整地址的單個HTML元素中提取地址的某些部分扛拨,例如郵政編碼。
內(nèi)容轉(zhuǎn)換還可以用于向內(nèi)容元素中插入一個值举塔,比如FixedValue元素绑警。例如求泰,可以使用內(nèi)容轉(zhuǎn)換腳本將項目輸入?yún)?shù)插入到內(nèi)容元素中。
您可以通過單擊內(nèi)容轉(zhuǎn)換(Content Transformation)按鈕向內(nèi)容元素添加內(nèi)容轉(zhuǎn)換计盒。
內(nèi)容轉(zhuǎn)換按鈕不能用于所有內(nèi)容類型渴频,比如PageAttribute內(nèi)容,但是您可以通過使用Advanced Options選項卡向這些內(nèi)容類型添加內(nèi)容轉(zhuǎn)換章郁。
當(dāng)您點擊內(nèi)容轉(zhuǎn)換按鈕時枉氮,內(nèi)容轉(zhuǎn)換腳本編輯器會打開。
您可以通過輸入左下角的輸入文本來測試內(nèi)容轉(zhuǎn)換暖庄,然后單擊Transform按鈕聊替。轉(zhuǎn)換后的結(jié)果將出現(xiàn)在右下方的窗口中。
內(nèi)容轉(zhuǎn)換可以定義為正則表達(dá)式或C#或VB.Net培廓。當(dāng)您希望從更大的提取文本中提取子文本時惹悄,經(jīng)常使用正則表達(dá)式。
正則表達(dá)式
Visual Web Ripper 的正則表達(dá)式腳本可以包括任意數(shù)量的正則表達(dá)式匹配和替換操作肩钠。每個regex操作必須在兩行中指定:第一行必須包含regex模式泣港,第二行必須包含操作,該操作可以返回价匠、替換或插入当纱。如果操作返回,則不需要返回(return)關(guān)鍵字踩窖。return操作將返回原始內(nèi)容中的第一個匹配坡氯,或者在匹配中選擇一個組。替換操作將替換原始內(nèi)容中的所有匹配洋腮,然后返回內(nèi)容箫柳。insert操作將一個匹配插入指定的字符串($$必須指定為一個組,而不是使用insert時$)啥供。
如果一個regex腳本包含多個regex操作悯恍,則下一個操作將處理前一個操作的輸出結(jié)果。
所有的正則表達(dá)式操作都是大小寫不敏感的伙狐,并且會忽略換行符涮毫。
下面的5個特殊操作應(yīng)該在一行中指定:
- strip_html 從內(nèi)容中刪除所有的HTML標(biāo)記。
- url_decode 解碼加密的URL鳞骤。
- html_decode 解碼經(jīng)加密的HTML
- trim 從內(nèi)容的開始和結(jié)束刪除換行符和空格窒百。
- line_breaks 將一些HTML標(biāo)簽(<p>,<br>,<li>)轉(zhuǎn)換成標(biāo)準(zhǔn)的Windows換行符。
-
to_lower 轉(zhuǎn)換文本為小寫
-to_upper 轉(zhuǎn)換文本為大寫 - capitalize_words 單詞首字母大寫于文本
語法{$content_name}
可用于在當(dāng)前模板中引用提取的數(shù)據(jù)豫尽。例如篙梢,如果您有一個名為product_id的內(nèi)容元素,您可以構(gòu)造下面的正則表達(dá)式來提取產(chǎn)品ID和第一個空白區(qū)域之間的所有文本美旧。
{$product_id}(.*?)\s
demo | description |
---|---|
.* return |
Returns the entire match, so everything in this case. 返回整個匹配渤滞,在此例子中贬墩。 |
A(.*?)B return $1 |
Returns the group 1 match, so everything between A and B. 返回組1匹配,所有的在A與B之間妄呕。 |
(A).*?(B) return $1$2 |
Returns group 1 and 2 matches, so A B in this case. 返回組1與2匹配陶舞,AB在此列中。 |
A(.*?)B replace |
Replaces every instance of everything between A and B (including A and B) with nothing. 在A與B(包含A與B)的所有實例替換為無nothing绪励。 |
A(.*?)B replace some new text |
Replaces every instance of everything between A and B (including A and B) with "some new text". 替換一些新文本肿孵,替換A和B(包括A和B)之間的所有實例,并使用“一些新文本”疏魏。 |
A(.*?)B replace $1 |
Replaces every instance of everything between A and B (including A and B) with the text between A and B, so in effect it removes A and B. 將A和B之間的所有實例(包括A和B)替換為A和B之間的文本停做,因此實際上它刪除了A和B。 |
A(.?)B return $1 C(.?)D replace |
First extracts everything between A and B, and then replaces every instance of everything between C and D (including C and D) with nothing. 首先提取A和B之間的所有內(nèi)容大莫,然后替換C和D之間的所有實例(包括C和D)蛉腌。 |
<br> replace \r\n |
Replaces all <BR> HTML tags with standard Windows line breaks. 用標(biāo)準(zhǔn)的Windows換行符替換所有的<BR>HTML標(biāo)簽。 |
A(.*?)B return $1 url_decode |
Returns the group 1 match, so everything between A and B, and then URL-decodes the result. 返回組1匹配只厘,所以A和B之間的所有內(nèi)容烙丛,然后url_decodes結(jié)果。 |
A(.*?)B insert C$$1D |
Inserts the first match between C and D. 在C和d之間插入第一個匹配項羔味。 |
Examples
demo | description |
---|---|
.* return |
Returns the entire match, so everything in this case. 返回整個匹配河咽,在此例子中。 |
A(.*?)B return $1 |
Returns the group 1 match, so everything between A and B. 返回組1匹配赋元,所有的在A與B之間库北。 |
(A).*?(B) return $1$2 |
Returns group 1 and 2 matches, so A B in this case. 返回組1與2匹配,AB在此列中们陆。 |
A(.*?)B replace |
Replaces every instance of everything between A and B (including A and B) with nothing. 在A與B(包含A與B)的所有實例替換為無nothing。 |
A(.*?)B replace some new text |
Replaces every instance of everything between A and B (including A and B) with "some new text". 替換一些新文本情屹,替換A和B(包括A和B)之間的所有實例坪仇,并使用“一些新文本”。 |
A(.*?)B replace $1 |
Replaces every instance of everything between A and B (including A and B) with the text between A and B, so in effect it removes A and B. 將A和B之間的所有實例(包括A和B)替換為A和B之間的文本垃你,因此實際上它刪除了A和B椅文。 |
A(.?)B return $1 C(.?)D replace |
First extracts everything between A and B, and then replaces every instance of everything between C and D (including C and D) with nothing. 首先提取A和B之間的所有內(nèi)容,然后替換C和D之間的所有實例(包括C和D)惜颇。 |
<br> replace \r\n |
Replaces all <BR> HTML tags with standard Windows line breaks. 用標(biāo)準(zhǔn)的Windows換行符替換所有的<BR>HTML標(biāo)簽皆刺。 |
A(.*?)B return $1 url_decode |
Returns the group 1 match, so everything between A and B, and then URL-decodes the result. 返回組1匹配,所以A和B之間的所有內(nèi)容凌摄,然后url_decodes結(jié)果羡蛾。 |
A(.*?)B insert C$$1D |
Inserts the first match between C and D. 在C和d之間插入第一個匹配項。 |
C# and VB.NET Scripts
內(nèi)容轉(zhuǎn)換腳本必須有一個方法锨亏,如下所示痴怨。
public static string TransformContent(WrContentTransformationArguments args)
{
try
{
//Place your transformation code here.
//This example just returns the input data
return args.Content;
}
catch (Exception exp)
{
//Place error handling here
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
public static string TransformContent(WrContentTransformationArguments args)
內(nèi)容轉(zhuǎn)換方法TransformContent
必須具有準(zhǔn)確的名稱和簽名忙干,因此只更改方法體,而不是方法簽名浪藻。該方法接收原始內(nèi)容作為參數(shù)捐迫,必須返回轉(zhuǎn)換后的內(nèi)容。
WrContentTransformationArguments Properties
Name | Type | Description |
---|---|---|
Content | string | The original extracted content. |
Text | string | The inner text of the extracted element. |
HTML | string | The outer HTML of the extracted element. |
WebBrowserElement | IHTMLElement | The extracted HTML element if the WebBrowser or InternetExplorer collectors are used. This property is null if the WebCrawler collector is used. |
WebCrawlerElement | SimpleHtmlElement | The extracted HTML element if the WebCrawler collector is used. This property is null if the WebBrowser or InternetExplorer collectors are used. |
Project | WrProject | The current Visual Web Ripper project. |
InternalDataRow | WrInternalDataRow | The current data row containing the extracted content in the current template. |
Database | WrSharedDatabase | An open database connection. * See Script Utilities for more information about shared script databases. |
InputDataRow | WrDataRow | The current input data row if an input data source has been defined. * See Using an Input Data Source for more information about input data sources. |
InputParameters | WrInputParameters | Input parameters for the current project. * See Using Input Parameters for more information about input parameters. |
Examples
下面的示例展示了一個內(nèi)容轉(zhuǎn)換腳本爱葵,該腳本用于將項目輸入?yún)?shù)分配給FixedValue內(nèi)容元素施戴。
using System;
using VisualWebRipper.Internal.SimpleHtmlParser;
using VisualWebRipper;
public class Script
{
public static string TransformContent(WrContentTransformationArguments args)
{
try
{
return args.InputParameters[ "par1" ];
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
}
下面的示例提取提取的內(nèi)容,并從另一個提取的元素中添加內(nèi)容萌丈。請注意赞哗,其他內(nèi)容必須在當(dāng)前內(nèi)容元素之前提取,否則在腳本運行時浓瞪,內(nèi)容元素將不可用懈玻。
using System;
using VisualWebRipper.Internal.SimpleHtmlParser;
using VisualWebRipper;
public class Script
{
public static string TransformContent(WrContentTransformationArguments args)
{
try
{
return args.Content + " " + args.InternalDataRow[ "moreDescription" ];
}
catch (Exception exp)
{
//Place error handling here
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
}
文件名轉(zhuǎn)換
using System;
using VisualWebRipper.Internal.SimpleHtmlParser;
using VisualWebRipper;
public class Script
{
//See help for a definition of WrContentTransformationArguments.
public static string TransformContent(WrContentTransformationArguments args)
{
try
{
return args.InternalDataRow[ "productName" ].Replace( " " , "_" );
}
catch (Exception exp)
{
//Place error handling here
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
}
鏈接轉(zhuǎn)換
C# and VB.NET Scripts
public static string TransformLink(WrLinkTransformationArguments args)
{
try
{
return args.Link;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
public static string TransformLink(WrLinkTransformationArguments args)
鏈接轉(zhuǎn)換方法TransformLink 必須有這個確切的名稱和簽名,所以只改變方法體乾颁,而不是方法簽名涂乌。該方法接收原始內(nèi)容作為參數(shù),并必須返回已轉(zhuǎn)換的鏈接英岭。
Example
using System;
using VisualWebRipper.Internal.SimpleHtmlParser;
using VisualWebRipper;
public class Script
{
//See help for a definition of WrContentTransformationArguments.
public static string TransformLink(WrLinkTransformationArguments args)
{
try
{
return "/products.aspx?ID=" + args.InternalDataRow["ProductId"];
}
catch (Exception exp)
{
//Place error handling here
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
}
表單字段輸入轉(zhuǎn)換
C# and VB.NET Scripts
public static string TransformInput(WrInputTransformationArguments args)
{
try
{
return args.InputData;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
Examples
下面的例子顯示了一個輸入轉(zhuǎn)換腳本湾盒,該腳本用于將一個項目輸入?yún)?shù)分配給FormField元素。
using System;
using VisualWebRipper.Internal.SimpleHtmlParser;
using VisualWebRipper;
public class Script
{
//See help for a definition of WrInputTransformationArguments.
public static string TransformInput(WrInputTransformationArguments args)
{
try
{
return args.InputParameters[ "par1" ];
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
}
下一個示例顯示了一個簡單地返回當(dāng)前日期的腳本诅妹。
using System;
using VisualWebRipper.Internal.SimpleHtmlParser;
using VisualWebRipper;
public class Script
{
//See help for a definition of WrInputTransformationArguments.
public static string TransformInput(WrInputTransformationArguments args)
{
try
{
return DateTime.Now.ToString("dd/MM/yyyy");
}
catch(Exception exp)
{
//Place error handling here
args.WriteDebug(exp.Message);
return "Custom script error";
}
}
}
內(nèi)容腳本 Content Scripts
在數(shù)據(jù)提取過程中罚勾,內(nèi)容腳本用于執(zhí)行定制腳本。此內(nèi)容類型不會生成任何輸出數(shù)據(jù)吭狡,也不會選擇任何HTML元素尖殃。通常,內(nèi)容腳本用于在提取數(shù)據(jù)時重新組織數(shù)據(jù)划煮。
腳本可以通過選擇以下選項之一在模板中的任何地方執(zhí)行送丰。請注意,如果您在模板中首先執(zhí)行腳本弛秋,那么在執(zhí)行腳本時器躏,從模板中提取的數(shù)據(jù)將不可用。
腳本選項 | Script Options |
---|---|
Execute script last in template | 在模板中提取所有內(nèi)容之后蟹略,執(zhí)行腳本登失,包括在任何子模板中定義的所有內(nèi)容。 |
Execute script first in template | 在提取模板中的任何內(nèi)容之前執(zhí)行腳本挖炬。 |
Execute script after | 在特定的內(nèi)容元素或模板之后執(zhí)行腳本揽浙。 |
當(dāng)您單擊腳本Script按鈕時,內(nèi)容腳本編輯器會打開。
C# and VB.NET Scripts
public static void ScriptMethod(WrContentScriptArguments args)
{
try
{
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
}
}
public static void ScriptMethod(WrContentScriptArguments args)
:腳本方法ScriptMethod必須具有確切的名稱和簽名捏萍,因此只更改方法體太抓。
Name | Type | Description |
---|---|---|
Project | WrProject | The current Visual Web Ripper project. |
InternalDataRow | WrInternalDataRow | The current data row containing the extracted content in the current template. |
Database | WrSharedDatabase | An open database connection. |
InputDataRow | WrInputDataRow | The current input data row if an input data source has been defined. |
InputParameters | WrInputParameters | Input parameters for the current project. |
WrContentScriptArguments Properties
Name | Type | Description |
---|---|---|
Project | WrProject | The current Visual Web Ripper project. |
InternalDataRow | WrInternalDataRow | The current data row containing the extracted content in the current template. |
Database | WrSharedDatabase | An open database connection. |
InputDataRow | WrInputDataRow | The current input data row if an input data source has been defined. |
InputParameters | WrInputParameters | Input parameters for the current project. |
Example
using System;
using mshtml;
using VisualWebRipper;
public class Script
{
//See help for a definition of WrContentScriptArguments.
public static void ScriptMethod(WrContentScriptArguments args)
{
try
{
int newValue = int .Parse(args.InternalDataRow[ "value" ]);
int sum = int .Parse(args.InternalDataRow[ "sum" ]);
args.InternalDataRow[ "sum" ] = (sum + newValue).ToString();
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
}
}
}
等待腳本 Wait Scripts
許多網(wǎng)站使用JavaScript和AJAX請求異步更新頁面。Visual Web Ripper 常沉铊荆可以鉤入AJAX請求走敌,從而確定AJAX請求何時完成。如果Visual Web Ripper無法連接到AJAX請求逗噩,或者無法確定AJAX請求何時完成掉丽,則需要使用異步JavaScript操作。
AJAX是一個JavaScript异雁,它執(zhí)行從web瀏覽器到web服務(wù)器的異步回調(diào)捶障。AJAX調(diào)用通常發(fā)生在用戶單擊鏈接或按鈕時。通常纲刀,他們從服務(wù)器檢索數(shù)據(jù)并在網(wǎng)頁上顯示项炼。AJAX調(diào)用異步執(zhí)行,從來不會加載一個全新的頁面示绊,因此用戶不會注意到AJAX回調(diào)锭部,除非發(fā)生在頁面上的更改。有些網(wǎng)站會顯示加載信息面褐,以便通知用戶新內(nèi)容正在加載拌禾。Visual Web Ripper可能無法檢測到AJAX回調(diào),除非是在網(wǎng)頁上尋找變化展哭。為了確定AJAX回調(diào)何時完成湃窍,您必須告訴Visual Web Ripper在網(wǎng)頁上的更改。
Visual Web Ripper需要等待一個AJAX回調(diào)來完成匪傍,這樣它就不會在新數(shù)據(jù)加載到頁面之前就開始提取數(shù)據(jù)了您市。
鏈接模板和FormSubmit模板可以有一個完整的頁面加載動Full page load作或JavaScript動作。如果您選擇了異步AJAX操作役衡,您可以選擇等待元素來讓Visual Web Ripper等待墨坚,以確定何時完成了AJAX調(diào)用。等待元素可以是項目中任何其他適當(dāng)?shù)膬?nèi)容或模板映挂。Visual Web Ripper等待被選擇為等待元素的HTML元素。如果您不選擇等待元素Wait Element盗尸,那么Visual Web Ripper會自動選擇鏈接中的第一個內(nèi)容元素或FormSubmit模板作為等待元素Wait Element柑船。
在打開一個具有異步JavaScript操作的模板時,遵循以下這些默認(rèn)步驟:
- 點擊選擇的鏈接或web表單按鈕泼各。
- 等待等待元素
Wait Element
從網(wǎng)頁中消失鞍时,或者等待等待元素Wait Element
的內(nèi)容發(fā)生變化。如果那個時候的等待元素Wait Element
在網(wǎng)頁上不存在,那么這個步驟就會自動完成逆巍。 - 等待等待元素
Wait Element
出現(xiàn)在網(wǎng)頁上及塘。
這些默認(rèn)的步驟通常很有效,但是有時您需要給Visual Web Ripper提供額外的信息锐极,以確定異步JavaScript何時完成笙僚。例如,等待元素的內(nèi)容可能會經(jīng)歷以下三個階段:
- 等待元素
Wait Element
包含原始內(nèi)容灵再。 - 等待元素內(nèi)容更改為“Loading..”肋层。
- 等待元素包含新內(nèi)容。
異步JavaScript調(diào)用在等待元素Wait Element
包含新內(nèi)容之前沒有完成翎迁,但是Visual Web Ripper不理解“Loading…”文本栋猖,所以它認(rèn)為這是它需要等待的新內(nèi)容瓣戚。Visual Web Ripper過早地停止等待異步JavaScript調(diào)用喻括,如果您的數(shù)據(jù)提取項目從等待元素中提取內(nèi)容,它將提取“Loading…”“文本而不是新內(nèi)容忽冻。在這種情況下痴腌,您需要一個等待腳本雌团,告訴Visual Web Ripper繼續(xù)等待等待元素的內(nèi)容發(fā)生變化,但如果內(nèi)容更改為“Loading…”衷掷,則繼續(xù)等待辱姨。
單擊腳本等待條件Script Wait Condition
按鈕,將一個等待腳本添加到AJAX操作戚嗅。
在您單擊腳本等待條件按鈕后雨涛,等待腳本編輯器將打開。
C# and VB.NET Scripts
public static bool IsAjaxCallCompleted(WrWaitScriptArguments args)
{
try
{
//Place your condition code here.
//This example waits until the old content has been replaced with new content,
//but waits a maximum of 3 seconds.
if (args.SecondsWaited>3)
return true ;
if (!args.OldContent.Equals(args.NewContent))
return true ;
return false ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return true ;
}
}
public static bool IsAjaxCallCompleted(WrWaitScriptArguments args)
等待腳本方法 IsAjaxCallCompleted 必須具有這個確切的名稱和簽名懦胞,所以只更改方法體替久,而不是方法簽名。當(dāng)AJAX調(diào)用完成時躏尉,該方法必須返回true蚯根,如果尚未完成,則返回false胀糜。
*WrWaitScriptArguments Properties *
Name | Type | Description |
---|---|---|
SecondsWaited | double | The number of seconds Visual Web Ripper has waited for the AJAX call to be completed. |
OldContent | string | The content of the wait element before the AJAX call was activated. The actual content depends on the content type selected for the wait element. |
NewContent | string | The current content of the wait element. The actual content depends on the content type selected for the wait element. |
OldText | string | The inner text of the wait element before the AJAX call was activated. |
NewText | string | The inner text content of the wait element. |
OldHtml | string | The outer HTML of the wait element before the AJAX call was activated. |
NewHtml | string | The current outer HTML of the wait element. |
WaitElement | IHTMLElement | The actual wait element. Please see Microsoft documentation for the IHTMLElement for more information. |
IsOptionalWait | bool | True if the AJAX call may not change the wait element. |
Project | WrProject | The current Visual Web Ripper project. |
InternalDataRow | WrInternalDataRow | The current data row containing the extracted content in the current template. |
Database | WrSharedDatabase | An open database connection. |
InputDataRow | WrDataRow | The current input data row if an input data source has been defined. |
InputParameters | WrInputParameters | Input parameters for the current project. |
Example
面的例子展示了等待等待的等待元素的等待颅拦,直到等待的元素的內(nèi)容發(fā)生變化,并且不等于“加載…”教藻。等待腳本最多等待3秒
using System;
using mshtml;
using VisualWebRipper;
public class Script
{
public static bool IsAjaxCallCompleted(WrWaitScriptArguments args)
{
try
{
if (args.SecondsWaited>3)
return true ;
if (!args.OldContent.Equals(args.NewContent) && !args.NewContent.Equals( "Loading..." ))
return true ;
return false ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return true ;
}
}
}
頁面轉(zhuǎn)換腳本 Page Transformation Scripts
C# and VB.NET Scripts
public static string TransformContent(WrContentTransformationArguments args)
{
try
{
return args.Content;
}
catch (Exception exp)
{
//Place error handling here
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
public static string TransformContent(WrContentTransformationArguments args)
頁面轉(zhuǎn)換方法轉(zhuǎn)換必須有準(zhǔn)確的名稱和簽名距帅,所以只修改方法體,而不是方法簽名括堤。該方法接收原始內(nèi)容作為參數(shù)碌秸,必須返回轉(zhuǎn)換后的內(nèi)容绍移。
Example
using System;
using VisualWebRipper.Internal.SimpleHtmlParser;
using VisualWebRipper;
public class Script
{
public static string TransformContent(WrContentTransformationArguments args)
{
try
{
return args.Content.Replace( "class=blue_text" , "" );
}
catch (Exception exp)
{
//Place error handling here
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
}
項目初始化腳本Project Initialization Scripts
項目初始化腳本在數(shù)據(jù)提取項目啟動之前運行。該腳本通常用于在項目啟動之前設(shè)置項目參數(shù)讥电,例如數(shù)據(jù)庫連接參數(shù)蹂窖。
通過在Advanced Options中單擊初始化腳本選項按鈕,您可以將項目初始化腳本添加到項目中恩敌。
在您單擊初始化腳本按鈕后瞬测,腳本編輯器將打開。
C# and VB.NET Scripts
public static bool InitializeProject(WrProjectInitializeArguments args)
{
try
{
//Place your script code here.
return true ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return false ;
}
}
public static bool InitializeProject(WrProjectInitializeArguments args)
腳本方法InitializeProject必須有這個確切的名稱和簽名潮剪,所以只修改方法體涣楷,而不是方法簽名。該方法必須返回true抗碰,以指示成功或false表示失敗狮斗。
Example
下面的示例展示了一個項目初始化腳本,該腳本將項目開始URL設(shè)置為輸入?yún)?shù)的值弧蝇。
using System;
using mshtml;
using VisualWebRipper;
public class Script
{
public static bool InitializeProject(WrProjectInitializeArguments args)
{
try
{
if (args.InputParameters.Contains( "url" ))
{
args.Project.StartUrls.Clear();
args.Project.StartUrls.Add(args.InputParameters[ "url" ]);
}
return true ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return false ;
}
}
}
API 參考API Considerations
項目初始化腳本是在運行項目之前執(zhí)行的碳褒,因此,如果您正在使用這個API來運行項目看疗,那么您的應(yīng)用程序應(yīng)該像這樣執(zhí)行任何項目初始化腳本:
if (project.ProjectInitialize.IsEnabled)
{
project.ProjectInitialize.ExecuteProjectInitializeScript(project);
}
自定義XPath函數(shù)
每次單擊web瀏覽器中的內(nèi)容時沙峻,Visual Web Ripper就會在幕后進(jìn)行一些高級處理,以計算選擇XPath两芳。XPath是一種常用的語法摔寨,用于在類似于xml的文檔中選擇元素,比如HTML文檔怖辆。Visual Web Ripper使用了XPath的定制實現(xiàn)是复,它支持XPath v1.0語法。定制的Visual Web Ripper XPath版本還支持一系列特別設(shè)計的新功能竖螃,以簡化Web抓取淑廊。除了內(nèi)置函數(shù)外,還可以定義自己的自定義函數(shù)特咆。
自定義XPath函數(shù)是通過向數(shù)據(jù)提取項目添加一個腳本來定義的季惩。單個腳本用于定義整個項目中的所有自定義XPath函數(shù)。這個腳本可以在Advanced Options屏幕上顯示腻格。
與其他XPath函數(shù)一樣画拾,使用自定義XPath函數(shù)。例如:
//DIV[@id='content']/DIV[MyCustomFunction(TABLE/TR[1]/TD[1])=1]
C# and VB.NET Scripts
自定義XPath函數(shù)可以有任意名稱和任意數(shù)量的參數(shù)菜职,但是返回類型和所有參數(shù)必須是下列類型之一:
- C#: int, double, DateTime, string, bool
- VB.NET: Integer, Double, DateTime, String, Boolean
public static bool CustomName1(WrXpathArguments args, string customArg1, bool customArg2)
{
try
{
return true ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return true ;
}
}
public static int CustomName2(string customArg1)
{
try
{
return 0;
}
catch (Exception exp)
{
return 0;
}
}
自定義XPath函數(shù)也可以有一個可選參數(shù)類型WrXpathArguments青抛。該參數(shù)必須是函數(shù)中的第一個參數(shù),并被自動添加到函數(shù)調(diào)用中些楣,因此在選擇XPath時調(diào)用函數(shù)時不應(yīng)指定該參數(shù)。
Name | Type | Description |
---|---|---|
Project | WrProject | The current Visual Web Ripper project. |
InternalDataRow | WrInternalDataRow | The current data row containing the extracted content in the current template. |
Database | WrSharedDatabase | An open database connection. |
InputDataRow | WrDataRow | The current input data row if an input data source has been defined. |
InputParameters | WrInputParameters | Input parameters for the current project. |
**WrXpathArguments Properties **
Name | Type | Description |
---|---|---|
Project | WrProject | The current Visual Web Ripper project. |
InternalDataRow | WrInternalDataRow | The current data row containing the extracted content in the current template. |
Database | WrSharedDatabase | An open database connection. |
InputDataRow | WrDataRow | The current input data row if an input data source has been defined. |
InputParameters | WrInputParameters | Input parameters for the current project. |
Example
using System;
using mshtml;
using VisualWebRipper;
public class Script
{
public static bool IsNotLastPage(WrXpathArguments args)
{
try
{
if (args.InternalDataRow[ "currentPage" ] == args.InternalDataRow[ "lastPage" ])
return false ;
else
return true ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return true ;
}
}
}
這個XPath函數(shù)可以用于一個Next Page導(dǎo)航鏈接總是顯示在頁面上,甚至在導(dǎo)航的最后一個頁面上愁茁。如果你使用一個分頁導(dǎo)航模板來處理這個導(dǎo)航蚕钦,Visual Web Ripper就會進(jìn)入一個無限循環(huán),因為Visual Web Ripper會繼續(xù)跟隨下一頁Next Page鏈接鹅很。如果頁面顯示當(dāng)前頁面索引和頁面總數(shù)嘶居,那么您可以提取該信息并使用上面的XPath函數(shù)來確保在當(dāng)前頁面等于導(dǎo)航的最后一頁時沒有選擇下一頁Next Page面鏈接。
//A[.="Next page"][IsNotLastPage()]
XPath轉(zhuǎn)換 XPath Transformation
可以使用XPath轉(zhuǎn)換腳本轉(zhuǎn)換模板或內(nèi)容元素的XPath促煮。XPath轉(zhuǎn)換腳本是非常專業(yè)的腳本邮屁,很少使用。使用XPath函數(shù)而不是XPath轉(zhuǎn)換總是更好菠齿,因為函數(shù)更容易使用佑吝,而且提供了更大的靈活性。
XPath轉(zhuǎn)換有時可以與重復(fù)父模板結(jié)合使用绳匀。如果您正在使用一個重復(fù)父模板重復(fù)一個模板來重復(fù)多個級別的子類別鏈接芋忿,那么您可能會發(fā)現(xiàn),在每個級別上的子類別鏈接都與以前的子類別級別的鏈接略有不同疾棵。當(dāng)前子類別鏈接的位置可能取決于前面的子類別鏈接的位置戈钢。這對于樹菜單布局來說尤其如此。
可以將XPath轉(zhuǎn)換定義為正則表達(dá)式或C#或VB.NET腳本是尔。c#或VB.NET腳本通常用于XPath轉(zhuǎn)換殉了,因為它提供對一些重要屬性的訪問,這些屬性在使用正則表達(dá)式時是不可訪問的拟枚。
C# and VB.NET Scripts
XPath轉(zhuǎn)換腳本必須有一個方法薪铜,如下所示。
public static string TransformXpath(WrXpathTransformationArguments args)
{
try
{
return args.Xpath;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
public static string TransformXpath(WrInputTransformationArguments args)
XPath轉(zhuǎn)換方法TransformXpath必須具有準(zhǔn)確的名稱和簽名梨州,因此只更改方法體痕囱,而不是方法簽名。該方法接收原始XPath作為參數(shù)暴匠,并必須返回已轉(zhuǎn)換的XPath鞍恢。
WrXpathTransformationArguments Properties
Name | Type | Description |
---|---|---|
XPath | string | The original XPath. |
ParentXpath | string | The XPath of the parent template. |
RepeatLevel | int | The number of times the same RepeatParent template has been processed. |
Project | WrProject | The current Visual Web Ripper project. |
InternalDataRow | WrInternalDataRow | The current data row containing the extracted content in the current template. |
Database | WrSharedDatabase | An open database connection. |
InputDataRow | WrDataRow | The current input data row if an input data source has been defined. |
InputParameters | WrInputParameters | Input parameters for the current project. |
Examples
下面的例子展示了一個在重復(fù)父模板上使用的XPath轉(zhuǎn)換腳本。該腳本根據(jù)父模板的XPath生成一個新的XPath每窖。重復(fù)父模板的父模板是相同的重復(fù)父模板帮掉,所以這是一個遞歸機(jī)制。如果是第一次在遞歸循環(huán)中處理重復(fù)父模板窒典,那么參數(shù)重復(fù)級別是1蟆炊。
using System;
using VisualWebRipper;
public class Script
{
public static string TransformXpath(WrXpathTransformationArguments args)
{
try
{
if (args.RepeatLevel>1)
return args.ParentXpath + "/../UL/LI/A" ;
else
return args.Xpath;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return "Custom script error" ;
}
}
}
條件腳本 Condition Scripts
條件腳本用于在某些條件不滿足時取消數(shù)據(jù)提取。您可以取消整個模板的數(shù)據(jù)提取瀑志,也可以取消當(dāng)前的內(nèi)容元素涩搓。如果您取消了list模板的數(shù)據(jù)提取污秆,您可以選擇是否應(yīng)該為整個元素列表取消數(shù)據(jù)提取,還是只選擇列表中的當(dāng)前元素昧甘。舉個例子,如果你有一個模板,列表遍歷一組產(chǎn)品鏈接,你使用一個腳本取消數(shù)據(jù)提取條件如果一個產(chǎn)品已經(jīng)存在于您的數(shù)據(jù)庫,那么你可以選擇取消數(shù)據(jù)提取只對當(dāng)前產(chǎn)品鏈接,而不是其他產(chǎn)品鏈接良拼。
您可以在Advanced Options窗口中向兩個模板和內(nèi)容元素添加條件腳本。
C# and VB.NET Scripts
public static bool IsCondition(WrConditionArguments args)
{
try
{
return true ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return true ;
}
}
public static bool IsCondition(WrConditionArguments args)
條件腳本方法IsCondition必須有這個確切的名稱和簽名充边,所以只修改方法體庸推,而不是方法簽名。該方法必須返回false浇冰,以觸發(fā)條件失敗Condition fail操作贬媒。
Example
using System;
using mshtml;
using VisualWebRipper;
public class Script
{
public static bool IsCondition(WrConditionArguments args)
{
try
{
args.Database.SetSql( "select count(*) as total from product where product_code=@productCode" );
args.Database.PrepareSql();
args.Database.SetParameterTextValue( "@productCode" , args.Content);
int total = ( int ) args.Database.ExecuteScalar();
if (total == 0)
return true ;
else
return false ;
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return true ;
}
}
}
輸入數(shù)據(jù)的腳本 Input Data Scripts
一個輸入數(shù)據(jù)腳本可以用來為一個項目生成輸入值。該腳本通常用于為項目生成啟動url肘习。如果該腳本用于生成啟動url际乘,則必須將該項目配置為從輸入數(shù)據(jù)源提供啟動url。
在將輸入數(shù)據(jù)源設(shè)置為腳本之后井厌,可以將輸入數(shù)據(jù)腳本添加到項目中蚓庭。
C# and VB.NET Scripts
using System;
using System.Data;
using mshtml;
using VisualWebRipper;
public class Script
{
//See help for a definition of WrInputDataScriptArguments.
public static DataTable GetInputData(WrInputDataScriptArguments args)
{
try
{
//Place your script code here.
return new DataTable();
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return null;
}
}
}
*public static bool GetInputData(WrGetInputDataArguments args)
這個腳本方法GetInputData必須有這個確切的名稱和簽名,所以只修改方法體仅仆,而不是方法簽名器赞。該方法必須返回一個標(biāo)準(zhǔn)。包含您想要向您的項目提供的輸入數(shù)據(jù)的NET DataTable墓拜。
WrGetInputDataArguments Properties
Name | Type | Description |
---|---|---|
Project | WrProject | The current Visual Web Ripper project. |
Database | WrSharedDatabase | An open database connection. |
InputParameters | WrInputParameters | Input parameters for the current project. |
Utility Classes
Visual Web Ripper 提供了一些實用程序類港柜,它們使創(chuàng)建輸入數(shù)據(jù)腳本變得更容易。
VisualWebRipper.ScriptUtils.ArrayToDataTable(string columnName, string[] values)
VisualWebRipper.ScriptUtils.ArrayToDataTable(string columnName, string stringFormat, string[] values)
ArrayToDataTable 方法是腳本類中的一個靜態(tài)方法咳榜,它可以用來將一個字符串?dāng)?shù)組轉(zhuǎn)換成一個單獨的列數(shù)據(jù)表夏醉。
VisualWebRipper.ScriptData.States.USA
USA屬性是狀態(tài)類中的一個靜態(tài)屬性,它返回一個字符串?dāng)?shù)組涌韩,其中包含了USA所有州的短名稱畔柔。
Examples
using System;
using System.Data;
using mshtml;
using VisualWebRipper;
using VisualWebRipper.ScriptData;
public class Script
{
public static DataTable GetInputData(WrInputDataScriptArguments args)
{
try
{
return ScriptUtils.ArrayToDataTable( "url" ,
"http://www.domain.com/states/{0}" , States.USA);
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return null;
}
}
}
下面的示例顯示了一個輸入數(shù)據(jù)腳本,該腳本根據(jù)數(shù)字1到1000生成一個開始url的列表臣樱。
using System;
using System.Collections.Generic;
using System.Data;
using mshtml;
using VisualWebRipper;
public class Script
{
public static DataTable GetInputData(WrInputDataScriptArguments args)
{
try
{
List<string> urls = new List<string>();
for ( int i = 1;i < 1000;i++)
{
urls.Add( "http://www.domain.com/page.php?ID=" +i.ToString());
}
return ScriptUtils.ArrayToDataTable( "url" , urls.ToArray());
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return null;
}
}
}
下面的示例與上面的示例相同靶擦,但是使用一個輸入?yún)?shù)來指定最大索引。
using System;
using System.Collections.Generic;
using System.Data;
using mshtml;
using VisualWebRipper;
public class Script
{
public static DataTable GetInputData(WrInputDataScriptArguments args)
{
try
{
List<string> urls = new List<string>();
int maxIndex = int .Parse(args.InputParameters[ "MaxIndex" ]);
for ( int i = 0;i < maxIndex;i++)
{
urls.Add( "http://www.domain.com/page.php?ID=" +i.ToString());
}
return ScriptUtils.ArrayToDataTable( "url" , urls.ToArray());
}
catch (Exception exp)
{
args.WriteDebug(exp.Message);
return null;
}
}
}
下面的示例從XML文件中讀取url雇毫。您需要包含assembly參考system.xml.Linq和System.Core 是為了編譯這個腳本玄捕。
public static DataTable GetInputData(WrInputDataScriptArguments args)
{
try
{
XNamespace ns = http://www.google.com/schemas/sitemap/0.84;
XDocument xmlFile = XDocument.Load(http://www.mydomain.com/myxml.xml);
var result = from r in xmlFile.Descendants(ns + "url") select r.Element(ns + "loc").Value;
string[] urls = result.ToArray();
return ScriptUtils.ArrayToDataTable("Url", urls);
}
catch(Exception exp)
{
args.WriteDebug("Custom script error: " + exp.Message);
return null;
}
}
使用第三方組件Using 3rd Party Assemblies
您可以在腳本中使用第三方程序集,但是您必須首先在項目程序集引用(Project Assembly References)屏幕上添加一個組件引用棚放。使用管理程序集引用(Manage Assembly References)按鈕打開這個屏幕枚粘。
記住這點很重要: .NET不能從可執(zhí)行文件的文件夾外部加載程序集。這意味著所有的第三方程序集應(yīng)該被復(fù)制到Visual Web Ripper安裝文件夾中飘蚯。Visual Web Ripper不會自動將選擇的程序集復(fù)制到安裝文件夾馍迄。如果您使用的是Visual Web Ripper API福也,那么第三方程序集必須被復(fù)制到您自己的應(yīng)用程序的文件夾中。