腳本之內(nèi)容轉(zhuǎn)換

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)換计盒。

image.png

內(nèi)容轉(zhuǎn)換按鈕不能用于所有內(nèi)容類型渴频,比如PageAttribute內(nèi)容,但是您可以通過使用Advanced Options選項卡向這些內(nèi)容類型添加內(nèi)容轉(zhuǎn)換章郁。

image.png

當(dāng)您點擊內(nèi)容轉(zhuǎn)換按鈕時枉氮,內(nèi)容轉(zhuǎn)換腳本編輯器會打開。


image.png

您可以通過輸入左下角的輸入文本來測試內(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ù)將不可用。

image.png
腳本選項 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)容腳本編輯器會打開。

image.png

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)步驟:

  1. 點擊選擇的鏈接或web表單按鈕泼各。
  2. 等待等待元素Wait Element從網(wǎng)頁中消失鞍时,或者等待等待元素Wait Element的內(nèi)容發(fā)生變化。如果那個時候的等待元素Wait Element在網(wǎng)頁上不存在,那么這個步驟就會自動完成逆巍。
  3. 等待等待元素Wait Element出現(xiàn)在網(wǎng)頁上及塘。

這些默認(rèn)的步驟通常很有效,但是有時您需要給Visual Web Ripper提供額外的信息锐极,以確定異步JavaScript何時完成笙僚。例如,等待元素的內(nèi)容可能會經(jīng)歷以下三個階段:

  1. 等待元素Wait Element包含原始內(nèi)容灵再。
  2. 等待元素內(nèi)容更改為“Loading..”肋层。
  3. 等待元素包含新內(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操作戚嗅。

image.png

在您單擊腳本等待條件按鈕后雨涛,等待腳本編輯器將打開。

image.png

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


image.png

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中單擊初始化腳本選項按鈕,您可以將項目初始化腳本添加到項目中恩敌。

image.png

在您單擊初始化腳本按鈕后瞬测,腳本編輯器將打開。


image.png

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屏幕上顯示腻格。


image.png
image.png

與其他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)容元素添加條件腳本。

image.png
image.png

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ù)腳本添加到項目中蚓庭。

image.png

image.png

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)按鈕打開這個屏幕枚粘。

image.png

記住這點很重要: .NET不能從可執(zhí)行文件的文件夾外部加載程序集。這意味著所有的第三方程序集應(yīng)該被復(fù)制到Visual Web Ripper安裝文件夾中飘蚯。Visual Web Ripper不會自動將選擇的程序集復(fù)制到安裝文件夾馍迄。如果您使用的是Visual Web Ripper API福也,那么第三方程序集必須被復(fù)制到您自己的應(yīng)用程序的文件夾中。
























最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀圈,一起剝皮案震驚了整個濱河市拟杉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌量承,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穴店,死亡現(xiàn)場離奇詭異撕捍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泣洞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門忧风,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人球凰,你說我怎么就攤上這事狮腿。” “怎么了呕诉?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵缘厢,是天一觀的道長。 經(jīng)常有香客問我甩挫,道長贴硫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任伊者,我火速辦了婚禮英遭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亦渗。我一直安慰自己挖诸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布法精。 她就那樣靜靜地躺著多律,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亿虽。 梳的紋絲不亂的頭發(fā)上菱涤,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音洛勉,去河邊找鬼粘秆。 笑死,一個胖子當(dāng)著我的面吹牛收毫,可吹牛的內(nèi)容都是我干的攻走。 我是一名探鬼主播殷勘,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昔搂!你這毒婦竟也來了玲销?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤摘符,失蹤者是張志新(化名)和其女友劉穎贤斜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逛裤,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瘩绒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了带族。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锁荔。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝙砌,靈堂內(nèi)的尸體忽然破棺而出阳堕,到底是詐尸還是另有隱情,我是刑警寧澤择克,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布恬总,位于F島的核電站,受9級特大地震影響肚邢,放射性物質(zhì)發(fā)生泄漏越驻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一道偷、第九天 我趴在偏房一處隱蔽的房頂上張望缀旁。 院中可真熱鬧,春花似錦勺鸦、人聲如沸并巍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懊渡。三九已至,卻和暖如春军拟,著一層夾襖步出監(jiān)牢的瞬間剃执,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工懈息, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留肾档,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像怒见,于是被迫代替她去往敵國和親俗慈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理遣耍,服務(wù)發(fā)現(xiàn)闺阱,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫舵变、插件酣溃、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 匆匆逝過的時間,誰也無法挽留纪隙,只有情感還留在那一刻救拉,只是已經(jīng)沒辦法重來。 偷偷進(jìn)去看過你們寫得東西瘫拣,或許你們都不知...
    _羋小念_閱讀 245評論 0 0
  • 1、 之前建立過100告喊、200麸拄、500人的微信群,主要是以生涯規(guī)劃黔姜、職場學(xué)習(xí)交流為主拢切,定期有輸出干貨,但玩法設(shè)計太...
    愛之涯閱讀 237評論 0 1
  • 古往今來秆吵,文人墨客對春都是情有獨鐘淮椰,許多繪春的古詩詞膾炙人口,“野火燒不盡纳寂,春風(fēng)吹又生主穗。”讓我們看到了春的生機(jī)勃發(fā)...
    寫心之所想閱讀 226評論 0 0