Selection Techniques
選擇技術(shù)是web抓取最重要的方面之一。當(dāng)您點(diǎn)擊web瀏覽器中的內(nèi)容來創(chuàng)建內(nèi)容和模板時(shí),您將使用最基本的選擇技術(shù),這是簡(jiǎn)單的point and click。除了簡(jiǎn)單的point and click功能外,Visual Web Ripper還提供了一系列工具來幫助你做出完美的選擇。這些工具包括:
- 允許您操作選擇XPath的XPath編輯器
- 樹形視圖瀏覽器提供了一個(gè)不同的,更精確的網(wǎng)頁視圖
- 列表選項(xiàng),幫助您創(chuàng)建選擇元素列表的選項(xiàng)
- 幫助您將條件應(yīng)用到選擇XPath的過濾器
很重要的一點(diǎn)是,當(dāng)您在Web瀏覽器中選擇HTML元素時(shí),Visual Web Ripper無法讀懂您的思路。新手用戶常常會(huì)在一些情況下感到困惑,比如當(dāng)他們有一個(gè)搜索結(jié)果時(shí),每個(gè)條目都有一個(gè)標(biāo)題。有時(shí)標(biāo)題是鏈接,有時(shí)是純文本,所以標(biāo)題的HTML可能是這樣的:
<h1><a >Heading as a link</a></h1>
<h1><span>Heading as plain text</span></h1>
如果您想要提取所有標(biāo)題的文本,您可以選擇第一個(gè)標(biāo)題,并通過重復(fù)選擇創(chuàng)建一個(gè)列表模板。如果第一個(gè)標(biāo)題是鏈接,那么這樣的選擇只會(huì)選擇鏈接的標(biāo)題,而不是純文本的標(biāo)題。Visual Web Ripper 不知道你想要提取所有的標(biāo)題,但是認(rèn)為你在嘗試選擇鏈接。在本例中,您需要更改選擇,以便在創(chuàng)建列表之前選擇“標(biāo)記”而不是鏈接標(biāo)記。
選擇XPath
每次單擊web瀏覽器中的內(nèi)容時(shí),Visual Web Ripper 就會(huì)在幕后進(jìn)行一些高級(jí)處理,以計(jì)算選擇XPath。XPath是一種常用的語法,用于在類似于xml的文檔中選擇元素,比如HTML文檔。Visual Web Ripper 使用了XPath的定制實(shí)現(xiàn),它支持XPath v1.0語法。定制的Visual Web Ripper XPath版本還支持一系列特別設(shè)計(jì)的新方法來簡(jiǎn)化Web抓取。
選擇XPath可以選擇一個(gè)或多個(gè)HTML元素。通常,創(chuàng)建list模板使用一個(gè)選擇多個(gè)元素的XPath。
Visual Web Ripper 有一系列工具可以幫助您創(chuàng)建一個(gè)完美的XPath,而不需要了解XPath語法。但是,在某些情況下,您可能需要手動(dòng)調(diào)整XPath,因此,如果您想成為一個(gè)專業(yè)的web采集機(jī),您必須知道XPath語法。
每次在web瀏覽器中進(jìn)行選擇時(shí),您都可以在Options選項(xiàng)卡中查看選擇XPath。
上面的圖像中的XPath包含以下兩個(gè)步驟:
- 使用ID屬性值listView選擇頁面上的所有DIV標(biāo)簽
- 然后選擇帶有class屬性值hproduct的所有子DIV標(biāo)簽
Visual Web Ripper 支持自定義XPath函數(shù)。請(qǐng)參閱自定義XPath函數(shù)獲得更多信息。
Visual Web Ripper 支持以下非標(biāo)準(zhǔn)XPath方法、屬性和axis。
非標(biāo)準(zhǔn)的XPath方法 | Non-standard XPath Methods |
---|---|
Position | 這是標(biāo)準(zhǔn)位置方法的一個(gè)擴(kuò)展。 Position() - 類似于標(biāo)準(zhǔn) Postion XPath方法。Position(StartIndex) - 選擇除第一個(gè) StartIndex 節(jié)點(diǎn)之外的所有節(jié)點(diǎn)。Position(StartIndex, EndIndex) - 選擇 StartIndex 和EndIndex 之間的所有節(jié)點(diǎn)。Position(StartIndex, EndIndex, SkipLastIndex) - 選擇 StartIndex 和EndIndex-SkipLastIndex 之間的所有節(jié)點(diǎn)。如果EndIndex 為0,那么簡(jiǎn)單地跳過最后一個(gè)SkipLastIndex 節(jié)點(diǎn)。Example: //table/tr/[position(2,0,1)]
|
Count | 返回給定XPath的節(jié)點(diǎn)數(shù)量。Count(XPath) Example: //table/tr/[count(td)=2]
|
Span | 在選擇中包含許多兄弟節(jié)點(diǎn)。 Span(Count) -在選擇中包括計(jì)數(shù)Count的兄弟節(jié)點(diǎn)。 Span(UntilElementXPath) - 包括所有的兄弟節(jié)點(diǎn),直到遇到 UntilElementXPath 指定的元素為止。Example: //div/p[span('hr')]
|
非標(biāo)準(zhǔn)XPath屬性 | Non-standard XPath Attributes |
node-position | 返回當(dāng)前節(jié)點(diǎn)在其父節(jié)點(diǎn)中的位置。 |
root-node-position | 返回其父節(jié)點(diǎn)中的根節(jié)點(diǎn)的位置。這只適用于PageArea模板選擇,因?yàn)橐粋€(gè)PageArea的根節(jié)點(diǎn)不是文檔的根節(jié)點(diǎn)。如果PageArea tempate是一個(gè)列表模板,那么根節(jié)點(diǎn)就是當(dāng)前的PageArea列表元素的節(jié)點(diǎn)。 |
tag-text | 返回當(dāng)前節(jié)點(diǎn)的文本,不包括任何子節(jié)點(diǎn)的文本。 |
非標(biāo)準(zhǔn)XPath Axis | Non-standard XPath Axis |
Root | 一個(gè)PageArea模板選擇的根節(jié)點(diǎn)。如果PageArea tempate是一個(gè)列表模板,那么根節(jié)點(diǎn)就是當(dāng)前的PageArea列表元素的節(jié)點(diǎn)。 |
優(yōu)化選擇XPath / Optimizing the Selection XPath
如果目標(biāo)頁面的變化稍微有些變化,那么長(zhǎng)的XPath不太可能很好地工作。XPath中的每一步都必須匹配頁面上的HTML標(biāo)記。如果這些標(biāo)記中的任何一個(gè)被刪除或移到網(wǎng)頁的其他地方,XPath將會(huì)失敗。
當(dāng)您在web瀏覽器中單擊HTML元素時(shí),Visual Web Ripper會(huì)自動(dòng)嘗試創(chuàng)建一個(gè)優(yōu)化的選擇XPath。它通過使XPath盡可能短而做到這一點(diǎn)。例如,對(duì)DIV HTML元素的完整選擇XPath路徑如下:
DIV[1]/DIV[5]/TABLE[2]/TBODY[1]/TR[2]/TD[1]/DIV
如果DIV標(biāo)簽有一個(gè)惟一的ID值listView,那么優(yōu)化的XPath就是:
//DIV[@id='listView']
Visual Web Ripper 將會(huì)在網(wǎng)頁上尋找一個(gè)具有ID屬性值listView的DIV標(biāo)簽。XPath非常健壯,對(duì)未來的頁面更改不敏感。只要這個(gè)元素存在于網(wǎng)頁上,XPath就可以工作,即使網(wǎng)頁的其他部分也會(huì)改變。
Visual Web Ripper 喜歡使用ID屬性來優(yōu)化xpath,因?yàn)镮Ds在web頁面上應(yīng)該是惟一的。然而,有時(shí)網(wǎng)站使用的ID是特定的內(nèi)容元素,例如產(chǎn)品ID,而這些ID不適合在XPath中使用。如果從產(chǎn)品目錄中提取數(shù)據(jù),通過使用XPath從所有產(chǎn)品細(xì)節(jié)頁面中提取產(chǎn)品標(biāo)題,您不希望XPath依賴于特定的產(chǎn)品ID,比如這個(gè)XPath:
//H1[@id='sku_245865']
這樣的XPath只適用于一種特定的產(chǎn)品,而不適用于其他產(chǎn)品。在這種情況下,您需要使用沒有IDs的XPath選項(xiàng)。您可以使用其他一些XPath選項(xiàng)來調(diào)整選擇。
Xpath 選項(xiàng) | XPath Options |
---|---|
Optimize XPath | 自動(dòng)嘗試優(yōu)化選擇XPath,使之盡可能短。這使得XPath更加健壯,對(duì)未來的頁面更改也不那么敏感。 |
Optimize without IDs | 選擇這個(gè)選項(xiàng),告訴Visual Web Ripper 不要在xpath中使用id。Visual Web Ripper 喜歡使用ID屬性來優(yōu)化xpath,因?yàn)镮D在網(wǎng)頁上應(yīng)該是唯一的。有些網(wǎng)站可能使用不適合XPath的id,因?yàn)樗鼈兣c網(wǎng)頁上的特定內(nèi)容有關(guān),比如產(chǎn)品id,或者因?yàn)樗鼈兪歉鶕?jù)日期和時(shí)間生成的。 |
Accuracy | 這個(gè)選項(xiàng)指定XPath中需要多少步驟。 一個(gè)四步XPath可以是這樣的: //TABLE/TBODY/TR/TD 一個(gè)兩步的XPath可以是這樣的: //TR/TD
|
Attributes | 該選項(xiàng)指定在XPath的第一步中應(yīng)該使用哪些屬性。 具有屬性類的XPath可以是這樣的: //TABLE[@class='table1']/TBODY/TR/TD 將查找?guī)в兄付▽傩缘牡谝粋€(gè)標(biāo)記,該屬性至少可以通過精度選項(xiàng)指定的步驟數(shù)量來生成XPath。例如,如果將屬性設(shè)置為類,并且精度設(shè)置為2,那么XPath仍然可以像下面的XPath一樣,如果標(biāo)記TBODY、TR和YD沒有一個(gè)類屬性: //TABLE[@class='table1']/TBODY/TR/TD
|
Row span | 在PageArea模板中使用行span,在選擇中包含指定的兄弟HTML元素?cái)?shù)量。 例如,您可能想要選擇標(biāo)題元素和以下兩段的第一個(gè)段落: <h1>header text<h1><p>paragraph1</p><p>paragraph2</p><p>paragraph3</p><p>paragraph4</p> 在本例中,您可以選擇header元素,并將行span選項(xiàng)設(shè)置為3。當(dāng)在List模板中使用Row span時(shí),它將應(yīng)用到列表中的所有項(xiàng),但是一個(gè)列表項(xiàng)的兄弟元素將不會(huì)與下一個(gè)列表項(xiàng)重疊。 |
創(chuàng)建列表Creating Lists
在許多情況下,您將希望從列表中提取數(shù)據(jù),例如表或搜索結(jié)果。Visual Web Ripper有幾個(gè)工具可以幫助你創(chuàng)建一個(gè)列表選擇。
嘗試使用不同的工具來確定給定場(chǎng)景的最佳技術(shù)。首先,最好先嘗試創(chuàng)建列表上下文菜單工具。如果這不起作用,試試不同的列表選項(xiàng)。
創(chuàng)建列表上下文菜單 The Create List Context Menu
創(chuàng)建一個(gè)在大多數(shù)場(chǎng)景中起作用的列表的最簡(jiǎn)單方法是使用create list上下文菜單,遵循以下兩個(gè)簡(jiǎn)單步驟:
- 在web瀏覽器中選擇列表中的第一個(gè)元素。這個(gè)選擇必須準(zhǔn)確地選擇第一個(gè)元素。例如,如果您正在創(chuàng)建一個(gè)選擇表中的所有行的列表,那么該選擇應(yīng)該選擇一個(gè)完整的表行。
- 右鍵單擊列表中的另一個(gè)元素,并從上下文菜單中選擇Create list。
以下兩步的過程如下圖所示:
步驟1 - 在web瀏覽器中選擇列表中的第一個(gè)元素
步驟2 - 右鍵單擊列表中的另一個(gè)元素
Visual Web Ripper 使用列表中的兩個(gè)元素的信息來創(chuàng)建完整的列表。如果列表中的行看起來不同,比如上面的圖像中的交錯(cuò)行,那么選擇一種類型的行并右鍵單擊另一種類型的行是很重要的,這樣Visual Web Ripper 就可以使用來自這兩種類型的信息來創(chuàng)建完整的列表。如果在選擇中沒有包含某些類型的行,或者如果您想從選擇中刪除某些類型的行,可以使用上下文菜單保存在列表中,并從列表中刪除。
列表選項(xiàng) List Options
列表選項(xiàng)可用于重復(fù)選擇,以便創(chuàng)建列表選擇。要使用列表選項(xiàng),您必須首先在web瀏覽器中選擇一個(gè)HTML元素,然后選擇其中一個(gè)列表選項(xiàng)。
自由重復(fù)(Free repeat)選項(xiàng)從選擇XPath中刪除位置信息,從而選擇一個(gè)與所選元素相似位置的頁面上的所有元素。這個(gè)選項(xiàng)通常會(huì)選擇太多的元素,但是您可以使用擴(kuò)展/限制(Expand/Limit)選擇工具欄按鈕來包含或者從列表選擇中排除元素。
流重復(fù)(Flow repeat)選項(xiàng)在其父容器中重復(fù)選擇。當(dāng)您想要選擇一個(gè)HTML列表中的所有元素,或者您想要選擇單個(gè)表行中的所有列時(shí),這個(gè)選項(xiàng)就可以很好地工作。
父流重復(fù)(Parent flow repeat)選項(xiàng)被設(shè)計(jì)用于為表中的所有行選擇單個(gè)列。
手動(dòng)(Manual)選項(xiàng)不修改選擇XPath。如果您想手動(dòng)輸入選擇XPath,請(qǐng)使用此選項(xiàng)。如果您輸入的是選擇多個(gè)元素的XPath,但是您沒有選擇手動(dòng)列表選項(xiàng),那么Visual Web Ripper 將不會(huì)把您的選擇識(shí)別為一個(gè)列表選擇,并且只處理列表中的第一個(gè)元素。
可以使用Start索引和Count選項(xiàng)來排除列表中的某些元素。Start index選項(xiàng)指定包含在列表中的第一個(gè)元素的索引。Count選項(xiàng)指定要包含在列表中的選項(xiàng)的數(shù)量。
Advanced Options選項(xiàng)卡包含列表選項(xiàng)跳過最后一行計(jì)數(shù),它指定從列表末尾刪除的固定數(shù)量的元素。
使用過濾器 Using Filters
選擇篩選器用于限制選擇,因此只有在滿足特定條件時(shí)才選擇元素。選擇過濾器通常用于以下兩種情況:
- 當(dāng)您想要將一個(gè)列表選擇限制為包含特定子元素的元素時(shí)
- 當(dāng)您想從屬性表中選擇一個(gè)值時(shí),一個(gè)特定的名稱/值對(duì)位于不同的web頁面的不同位置
使用篩選器來限制列表的選擇 Using a Filter to Limit a List Selection
下圖顯示了一個(gè)列表選擇,其中所有的行都被選中。標(biāo)題行是表中的一個(gè)普通行,因此這個(gè)行包含在列表中。如果您想從這個(gè)表中提取數(shù)據(jù),您通常不會(huì)對(duì)標(biāo)題行感興趣,因?yàn)樗话魏螖?shù)據(jù)。然而,有時(shí)很難將行排除在列表選擇之外。
請(qǐng)注意,上面的表中所有的行都有一個(gè)詳細(xì)的鏈接元素。您可以使用此信息來過濾列表,因此只有包含該鏈接的行才包含在列表中。您可以通過右鍵單擊鏈接元素,并從上下文菜單中選擇必須包含這個(gè)元素過濾器。
現(xiàn)在,標(biāo)題行已經(jīng)從下面的列表選擇中刪除了。
使用篩選器來選擇不同位置的內(nèi)容
模板定義了如何從一種類型的網(wǎng)頁中提取數(shù)據(jù),例如產(chǎn)品目錄中的產(chǎn)品細(xì)節(jié)頁面。有時(shí),內(nèi)容位于同一類型網(wǎng)頁的不同位置。例如,您可能有一個(gè)產(chǎn)品細(xì)節(jié)頁面,它顯示了產(chǎn)品屬性列表,例如下面的屏幕截圖。不同的產(chǎn)品可能有不同的產(chǎn)品特性。例如,在下圖中,產(chǎn)品屬性產(chǎn)品寬度可能位于表的不同位置。
Visual Web Ripper 在特定位置尋找內(nèi)容,因此對(duì)于一種產(chǎn)品,它可以提取產(chǎn)品寬度,但對(duì)于另一種產(chǎn)品,它可以提取產(chǎn)品重量。
文本過濾器可以處理不同位置的內(nèi)容。網(wǎng)頁上的大多數(shù)數(shù)據(jù)屬性都有一個(gè)相關(guān)的文本組件來描述數(shù)據(jù)屬性。在下面的網(wǎng)頁上,文本域產(chǎn)品寬度描述了產(chǎn)品寬度的數(shù)據(jù)屬性,因此你可以告訴Visual Web Ripper 在表格中尋找文本“產(chǎn)品寬度”,然后選擇相關(guān)的數(shù)據(jù)屬性。
要使用文本過濾器,選擇您想要提取的數(shù)據(jù)屬性,右鍵單擊相關(guān)聯(lián)的文本元素,然后選擇Must Have Text...過濾