scrapy基礎 之 xpath網頁結構
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網頁結構