1. 程式人生 > >scrapy基礎 之 xpath網頁結構

scrapy基礎 之 xpath網頁結構

5.0 sel books category 層級 enc descend ray 基礎

1 ,什麽是xpath

XPath 是一門在 XML 文檔中查找信息的語言。XML是一種類似於HTML的傳輸協議

2,節點

XPath 中,有七種類型的節點:元素、屬性、文本、命名空間、處理指令、註釋以及文檔(根)節點。

實例:

 <?xml version="1.0" encoding="ISO-8859-1"?>

 <bookstore>
  <book>
     <title lang="en">Harry Potter</title>
     <author>J K. Rowling</author>
     <year>2005</year>
     <price>29.99</price>
   </book>
</bookstore> 

  解析: <bookstore> (文檔節點) <author>J K. Rowling</author> (元素節點) lang="en" (屬性節點) J K. Rowling(基本值) #一般把基本值或者節點叫做項目。

節點關系有父和子之分:

 <book>    #父
   <title>Harry Potter</title>    #是book的子,同級的項目叫做同胞,title,auther,year 和price叫做同胞
   <author>J K. Rowling</author>    #同上
   <year>2005</year>    #同上
   <price>29.99</price>    #同上
 </book>

超過一級的父子節點關系叫做先輩和後代,比如父的父,子的子等

3,選取節點

XML實例:

<?xml version="1.0" encoding="ISO-8859-1"?>

 <bookstore>

 <book>
   <title lang="eng">Harry Potter</title>
   <price>29.99</price>
 </book>

 <book>
   <title lang="eng">Learning XML</title>
   <price>39.95</price>
 </book>

 </bookstore> 
#選取節點的規則

nodename 選取此節點的所有子節點。 / 從根節點選取。 // 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。 . 選取當前節點。 .. 選取當前節點的父節點。 @ 選取屬性。

節點選取實例:

bookstore	選取 bookstore 元素的所有子節點。
/bookstore	選取根元素 bookstore。註釋:假如路徑起始於正斜杠( / ),則此路徑始終代表到某元素的絕對路徑!
bookstore/book	選取屬於 bookstore 的子元素的所有 book 元素。
//book	選取所有 book 子元素,而不管它們在文檔中的位置。
bookstore//book	選擇屬於 bookstore 元素的後代的所有 book 元素,而不管它們位於 bookstore 之下的什麽位置。
//@lang	選取名為 lang 的所有屬性。
/bookstore/book/price/text() text()選取所有文本的意思

 註意:如果 XPath 的開頭是一個斜線(/)代表這是絕對路徑。如果開頭是兩個斜線(//)表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。

謂語:

/bookstore/book[1]	選取屬於 bookstore 子元素的第一個 book 元素。
/bookstore/book[last()]	選取屬於 bookstore 子元素的最後一個 book 元素。
/bookstore/book[last()-1]	選取屬於 bookstore 子元素的倒數第二個 book 元素。
/bookstore/book[position()<3]	選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素。
//title[@lang]	選取所有擁有名為 lang 的屬性的 title 元素。
//title[@lang=‘eng‘]	選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。
/bookstore/book[price>35.00]	選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。
/bookstore/book[price>35.00]/title	選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。

  

如何選取未知的節點:

*	匹配任何元素節點。
@*	匹配任何屬性節點。
node()	匹配任何類型的節點。

  /bookstore/* 選取 bookstore 元素的所有子元素。 //* 選取文檔中的所有元素。 //title[@*] 選取所有帶有屬性的 title 元素。

路徑表達式中使用"|"運算符,您可以選取若幹個路徑:

        //book/title | //book/price 選取book 元素的所有 title 和 price 元素。

        //title | //price 選取文檔中的所有 title 和 price

4 軸

通過 XPath 軸可以定義相對於當前節點的節點集。

ancestor	選取當前節點的所有先輩(父、祖父等)。
ancestor-or-self	選取當前節點的所有先輩(父、祖父等)以及當前節點本身。
attribute	選取當前節點的所有屬性。
child	選取當前節點的所有子元素。
descendant	選取當前節點的所有後代元素(子、孫等)。
descendant-or-self	選取當前節點的所有後代元素(子、孫等)以及當前節點本身。
following	選取文檔中當前節點的結束標簽之後的所有節點。
namespace	選取當前節點的所有命名空間節點。
parent	選取當前節點的父節點。
preceding	選取文檔中當前節點的開始標簽之前的所有節點。
preceding-sibling	選取當前節點之前的所有同級節點。
self	選取當前節點。

6 實例

<?xml version="1.0" encoding="ISO-8859-1"?>

 <bookstore>

 <book category="COOKING">
   <title lang="en">Everyday Italian</title>
   <author>Giada De Laurentiis</author>
   <year>2005</year>
   <price>30.00</price>
 </book>

 <book category="CHILDREN">
   <title lang="en">Harry Potter</title>
   <author>J K. Rowling</author>
   <year>2005</year>
   <price>29.99</price>
 </book>

 <book category="WEB">
   <title lang="en">XQuery Kick Start</title>
   <author>James McGovern</author>
   <author>Per Bothner</author>
   <author>Kurt Cagle</author>
   <author>James Linn</author>
   <author>Vaidyanathan Nagarajan</author>
   <year>2003</year>
   <price>49.99</price>
 </book>

 <book category="WEB">
   <title lang="en">Learning XML</title>
   <author>Erik T. Ray</author>
   <year>2003</year>
   <price>39.95</price>
 </book>

 </bookstore> 

選取所有的title:/bookstore/book/title

選取第一個book下面的title:/bookstore/book[1]/title

選取price節點中所有的文本:/bookstore/book/price/text()

選取價格高於35的所有price節點的文本:/bookstore/book[price>35]/price

選取價格節點高於35的所有title節點:/bookstore/book[price>35]/title

scrapy基礎 之 xpath網頁結構