版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
4.2scrapy中查找HTML元素(1)4.2scrapy中查找HTML元素(1)在前面我們已經(jīng)知道使用BeautifulSoup能查找HTML中的元素,scrapy中也有強(qiáng)大的查找HTML元素的功能,那就是使用xpath方法。xpath方法使用XPath語(yǔ)法,比BeautifulSoup的select要靈活而且速度快。
在前面我們已經(jīng)知道使用BeautifulSoup能查找HTM例4-2-1:使用xpath查找HTML中的元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><book><titlelang="eng">HarryPotter</title><price>29.99</price></book><book><titlelang="eng">LearningXML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)print(type(selector));print(selector)s=selector.xpath("http://title")print(type(s))print(s)例4-2-1:使用xpath查找HTML中的元素程序結(jié)果:class'scrapy.selector.unified.Selector'><Selectorxpath=Nonedata='<html><body>\n<bookstore>\n<book>\n<title'><class'scrapy.selector.unified.SelectorList'>[<Selectorxpath='//title'data='<titlelang="eng">HarryPotter</title>'>,<Selectorxpath='//title'data='<titlelang="eng">LearningXML</title>'>]程序結(jié)果:(1)fromscrapy.selectorimportSelector從scrapy中引入Selector類(lèi),這個(gè)類(lèi)就是選擇查找類(lèi)。(2)selector=Selector(text=htmlText)使用htmlText的文字建立Selector類(lèi),就是裝載HTML文檔,文檔裝載后就形成一個(gè)Selector對(duì)象,就可以使用xpath查找元素。(3)print(type(selector)可看到selector是一個(gè)類(lèi)型為scrapy.selector.unified.Selector,這個(gè)類(lèi)型是一個(gè)有xpath方法的類(lèi)型。((1)fromscrapy.selectorimpor(4)s=selector.xpath("http://title")這個(gè)方法在文檔中查找所有的<title>的元素,其中"http://"表示文檔中的任何位置。一般地:selector.xpath("http://tagName")表示在權(quán)文檔中搜索<tagName>的tags,形成一個(gè)Selector的列表。(5)print(type(s))由于<title>有兩個(gè)元素,因此我們看到這是一個(gè)scrapy.selector.unified.SelectorList類(lèi),類(lèi)似scrapy.selector.unified.Selector的列表。(6)print(s)我們看到s包含兩個(gè)Selector對(duì)象,一個(gè)是<Selectorxpath='//title'data='<titlelang="eng">HarryPotter</title>'>,另外一個(gè)是<Selectorxpath='//title'data='<titlelang="eng">LearningXML</title>'>。<Selectorxpath='//title'data='<titlelang="eng">LearningXML</title>'>(4)s=selector.xpath("http://title"由此可見(jiàn)一般selector搜索一個(gè)<tagName>的HTML元素的方法是:selector.xpath("http://tagName")在裝載HTML文檔后selector=Selector(text=htmlText)得到的selector是對(duì)應(yīng)全文檔頂層的元素<html>的,其中"http://"表示全文檔搜索,結(jié)果是一個(gè)Selector的列表,哪怕只有一個(gè)元素也成一個(gè)列表,例如:selector.xpath("http://body")搜索到<body>元素,結(jié)果是一個(gè)Selector的列表,包含一個(gè)Selector元素;selector.xpath("http://title")搜索到兩個(gè)<title>元素,結(jié)果是Selector的列表,包含2個(gè)Selector元素;selector.xpath("http://book")搜索到兩個(gè)<book>元素,結(jié)果是Selector的列表,包含2個(gè)Selector元素;
由此可見(jiàn)一般selector搜索一個(gè)<tagName>的HT4.2scrapy中查找HTML元素(2)4.2scrapy中查找HTML元素(2)1、使用"http://"表示文檔下面的所有節(jié)點(diǎn)元素,用"/"表示當(dāng)前節(jié)點(diǎn)的下一級(jí)節(jié)點(diǎn)元素。
例4-2-2:"http://"與"/"的使用selector.xpath("http://bookstore/book")搜索<bookstore>下一級(jí)的<book>元素,找到2個(gè);selector.xpath("http://body/book")搜索<body>下一級(jí)的<book>元素,結(jié)果為空;selector.xpath("http://body//book")搜索<body>下<book>元素,找到2個(gè);selector.xpath("/body//book")搜索文檔下一級(jí)的<body>下的<book>元素,找結(jié)果為空,因?yàn)槲臋n的下一級(jí)是<html>元素,不是<body>元素;selector.xpath("/html/body//book")或者selector.xpath("/html//book")搜索<book>元素,找到2個(gè);selector.xpah("http://book/title")搜索文檔中所有<book>下一級(jí)的<title>元素,找到2個(gè),結(jié)果與selector.xpah("http://title")、selector.xpath("http://bookstore//title")一樣;selector.xpath("http://book//price")與selector.xpath("http://price")結(jié)果一樣,都是找到2個(gè)<price>元素;1、使用"http://"表示文檔下面的所有節(jié)點(diǎn)元素,用"/"表示當(dāng)前2、使用"."表示當(dāng)前節(jié)點(diǎn)元素,使用xpath可以連續(xù)調(diào)用,如果前一個(gè)xpath返回一個(gè)Selector的列表,那么這個(gè)列表可以繼續(xù)調(diào)用xpath,功能是為每個(gè)列表元素調(diào)用xpath,最后結(jié)果是全部元素調(diào)用xpath的匯總。
例4-2-3:使用"."進(jìn)行xpath連續(xù)調(diào)用fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><title>books</title><book><title>Novel</title><titlelang="eng">HarryPotter</title><price>29.99</price></book><book><title>TextBook</title><titlelang="eng">LearningXML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book").xpath("./title")foreins:print(e)2、使用"."表示當(dāng)前節(jié)點(diǎn)元素,使用xpath可以連續(xù)調(diào)用,程序結(jié)果:<Selectorxpath='//book/title'data='<title>Novel</title>'><Selectorxpath='//book/title'data='<titlelang="eng">HarryPotter</title>'><Selectorxpath='//book/title'data='<title>TextBook</title>'><Selectorxpath='//book/title'data='<titlelang="eng">LearningXML</title>'>我們看到selector.xpath("http://book")首先搜索到文檔中所有<book>元素,總共有2個(gè),然后再次調(diào)用xpath("./title"),就是從當(dāng)前元素<book>開(kāi)始往下一級(jí)搜索<title>,每個(gè)<book>都找到2個(gè)<title>,因此結(jié)果有4個(gè)<title>。程序結(jié)果:注意如果xpath連續(xù)調(diào)用時(shí)不指定是從前一個(gè)xpath的結(jié)果元素開(kāi)始的,那么默認(rèn)是從全文檔開(kāi)始的,結(jié)果會(huì)不一樣,例如:s=selector.xpath("http://book").xpath("/title")結(jié)果是空的,因?yàn)楹竺娴膞path("/title")從文檔開(kāi)始搜索<title>。s=selector.xpath("http://book").xpath("http://title")結(jié)果有10個(gè)元素,因?yàn)槊總€(gè)<book>都驅(qū)動(dòng)xpath("http://title")在全文檔搜索<title>元素,每次都搜索到5個(gè)元素。注意如果xpath連續(xù)調(diào)用時(shí)不指定是從前一個(gè)xpath的結(jié)果4.2scrapy中查找HTML元素(3)4.2scrapy中查找HTML元素(3)3、如果xpath返回的Selector對(duì)象列表,再次調(diào)用extract()函數(shù)會(huì)得到這些對(duì)象的元素文本的列表,使用extract_first()獲取列表中第一個(gè)元素值,如果列表為空extract_first()的值為None。而對(duì)于單一的一個(gè)Selector對(duì)象,調(diào)用extract()函數(shù)就可以得到Selector對(duì)象對(duì)應(yīng)的元素的文本值。單一的Selector對(duì)象沒(méi)有extract_first()函數(shù)。3、如果xpath返回的Selector對(duì)象列表,再次調(diào)用e例4-2-4:extract與extract_first函數(shù)使用fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/price")print(type(s),s)s=selector.xpath("http://book/price").extract()print(type(s),s)s=selector.xpath("http://book/price").extract_first()print(type(s),s)例4-2-4:extract與extract_first函數(shù)程序結(jié)果:<class'scrapy.selector.unified.SelectorList'>[<Selectorxpath='//book/price'data='<price>29.99</price>'>,<Selectorxpath='//book/price'data='<price>39.95</price>'>]<class'list'>['<price>29.99</price>','<price>39.95</price>']<class'str'><price>29.99</price>由此可見(jiàn):s=selector.xpath("http://book/price")得到的是SelectorList列表;s=selector.xpath("http://book/price").extract()得到的是<price>元素的Selector對(duì)象對(duì)應(yīng)的<price>元素的文本組成的列表,即:['<price>29.99</price>','<price>39.95</price>']s=selector.xpath("http://book/price").extrac_first()得到的是<price>元素的文本組成的列表的第一個(gè)元素,是一個(gè)文本,即:<price>29.99</price>程序結(jié)果:4、xpath使用"/@attrName"得到一個(gè)Selector元素的attrName屬性節(jié)點(diǎn)對(duì)象,屬性節(jié)點(diǎn)對(duì)象也是一個(gè)Selector對(duì)象,通過(guò)extract()獲取屬性值。
例4-2-5:獲取元素屬性值htmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/@id")print(s)print(s.extract())foreins:print(e.extract())4、xpath使用"/@attrName"得到一個(gè)Selec程序結(jié)果:[<Selectorxpath='//book/@id'data='b1'>,<Selectorxpath='//book/@id'data='b2'>]['b1','b2']b1b2由此可見(jiàn):s=selector.xpath("http://book/@id")結(jié)果是2個(gè)<book>的id屬性組成的SelectorList列表,即屬性也是一個(gè)Selector對(duì)象;print(s.extract())結(jié)果是<book>的id屬性的兩個(gè)Selector對(duì)象的屬性文本值的列表,即['b1','b2'];foreins:print(e.extract())每個(gè)e是一個(gè)Selector對(duì)象,因此extract()獲取對(duì)象的屬性值。程序結(jié)果:4.2scrapy中查找HTML元素(4)4.2scrapy中查找HTML元素(4)5、xpath使用"/text()"得到一個(gè)Selector元素包含的文本值,文本值節(jié)點(diǎn)對(duì)象也是一個(gè)Selector對(duì)象,通過(guò)extract()獲取文本值。
例:4-2-6:獲取節(jié)點(diǎn)的文本值fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/title/text()")print(s)print(s.extract())foreins:print(e.extract())5、xpath使用"/text()"得到一個(gè)Selector程序結(jié)果:[<Selectorxpath='//book/title/text()'data='HarryPotter'>,<Selectorxpath='//book/title/text()'data='學(xué)習(xí)XML'>]['HarryPotter','學(xué)習(xí)XML']HarryPotter學(xué)習(xí)XML
由此可見(jiàn):s=selector.xpath("http://book/title/text()")結(jié)果也是SelectorList列表,即文本也是一個(gè)節(jié)點(diǎn);print(s.extract())結(jié)果是文本節(jié)點(diǎn)的字符串值的列表,即['HarryPotter','學(xué)習(xí)XML'];foreins:print(e.extract())每個(gè)e是一個(gè)Selector對(duì)象,因此extract()獲取對(duì)象的屬性值。值得注意的是如果一個(gè)element的元素包含的文本不是單一的文本,那么可能會(huì)產(chǎn)生多個(gè)文本值。程序結(jié)果:例4-2-7:多個(gè)文本節(jié)點(diǎn)值fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english"><b>H</b>arry<b>P</b>otter</title><price>29.99</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/title/text()")print(s)print(s.extract())foreins:print(e.extract())例4-2-7:多個(gè)文本節(jié)點(diǎn)值程序結(jié)果:[<Selectorxpath='//book/title/text()'data='arry'>,<Selectorxpath='//book/title/text()'data='otter'>]['arry','otter']arryotter由此可見(jiàn)<title<中的文本值包含arry與otter兩個(gè)。程序結(jié)果:6、xpath使用"tag[condition]"來(lái)限定一個(gè)tag元素,其中condition是由這個(gè)tag的屬性、文本等計(jì)算出的一個(gè)邏輯值。如果有多個(gè)條件,那么可以寫(xiě)成:"tag[condition1][condition2]...[conditionN]"或者:"tag[condition1andcondition2and...andconditionN]"
6、xpath使用"tag[condition]"來(lái)限定一個(gè)例4-2-8:使用condition限定tag元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/title[@lang='chinese']/text()")print(s.extract_first())s=selector.xpath("http://book[@id='b1']/title")print(s.extract_first())例4-2-8:使用condition限定tag元素程序結(jié)果:學(xué)習(xí)XML<titlelang="english">HarryPotter</title>由此可見(jiàn):s=selector.xpath("http://book/title[@lang='chinese']/text()")搜索<book>下面屬性lang="chinese"的<title>s=selector.xpath("http://book[@id='b1']/title")搜索屬性id="b1"的<book>下面的<title>。程序結(jié)果:4.2scrapy中查找HTML元素(5)4.2scrapy中查找HTML元素(5)7、xpath可以使用position()來(lái)確定其中一個(gè)元素的限制,這個(gè)選擇序號(hào)是從1開(kāi)始的,不是從0開(kāi)始編號(hào)的,還可以通過(guò)and、or等構(gòu)造復(fù)雜的表達(dá)式。
例4-2-9:使用position()序號(hào)來(lái)確定鎖選擇的元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book[position()=1]/title")print(s.extract_first())s=selector.xpath("http://book[position()=2]/title")print(s.extract_first())7、xpath可以使用position()來(lái)確定其中一個(gè)元素程序結(jié)果:<titlelang="english">HarryPotter</title><titlelang="chinese">學(xué)習(xí)XML</title>其中:s=selector.xpath("http://book[position()=1]/title")s=selector.xpath("http://book[position()=1]/title")分別選擇第一、二個(gè)<book>元素。程序結(jié)果:8、xpath使用星號(hào)"*"代表任何Element節(jié)點(diǎn),不包括Text、Comment的節(jié)點(diǎn)。例4-2-10:使用"*"代表任何element元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://bookstore/*/title")print(s.extract())8、xpath使用星號(hào)"*"代表任何Element節(jié)點(diǎn),不包程序結(jié)果:['<titlelang="english">HarryPotter</title>','<titlelang="chinese">學(xué)習(xí)XML</title>']其中s=selector.xpath("http://bookstore/*/title")是搜索<bookstore>的孫子節(jié)點(diǎn)<title>,中間隔開(kāi)一層任何元素。
程序結(jié)果:4.2scrapy中查找HTML元素(6)4.2scrapy中查找HTML元素(6)9、xpath使用"@*"代表任何屬性
例4-2-11:使用@*代表屬性fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><book><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book[@*]/title")print(s.extract())s=selector.xpath("http://@*")print(s.extract())9、xpath使用"@*"代表任何屬性程序結(jié)果:['<titlelang="chinese">學(xué)習(xí)XML</title>']['english','b2','chinese']其中:s=selector.xpath("http://book[@*]/title")是搜索任何包含屬性的<book>元素下面的<title>,結(jié)果搜索到第二個(gè)<book>s=selector.xpath("http://@*")是搜索文檔中所有屬性節(jié)點(diǎn)。程序結(jié)果:10、xpath使用"element/parent::*"選擇element的父節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)只有一個(gè)。如果寫(xiě)成element/parent::tag,就指定element的tag父節(jié)點(diǎn),除非element的父節(jié)點(diǎn)正好為><tag>節(jié)點(diǎn),不然就為None。10、xpath使用"element/parent::*"選例4-2-12:xpath搜索元素的父節(jié)點(diǎn)fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><book><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://title[@lang='chinese']/parent::*")print(s.extract())
例4-2-12:xpath搜索元素的父節(jié)點(diǎn)程序結(jié)果:['<bookid="b2">\n<titlelang="chinese">學(xué)習(xí)XML</title>\n<price>39.95</price>\n</book>']其中s=selector.xpath("http://title[@lang='chinese']/parent::*")是查找屬性為lang='chinese'的<title>元素的父節(jié)點(diǎn),就是id="b2"的<book>元素節(jié)點(diǎn)。程序結(jié)果:4.2scrapy中查找HTML元素(7)4.2scrapy中查找HTML元素(7)11、xpath使用"element/folllowing-sibling::*"搜索element后面的同級(jí)的所有兄弟節(jié)點(diǎn),使用"element/folllowing-sibling::*[position()=1]"搜索element后面的同級(jí)的第一個(gè)兄弟節(jié)點(diǎn)。11、xpath使用"element/folllowing-例4-2-13:搜索后面的兄弟節(jié)點(diǎn)fromscrapy.selectorimportSelectorhtmlText="<a>A1</a><b>B1</b><c>C1</c><d>D<e>E</e></d><b>B2</b><c>C2</c>"selector=Selector(text=htmlText)s=selector.xpath("http://a/following-sibling::*")print(s.extract())s=selector.xpath("http://a/following-sibling::*[position()=1]")print(s.extract())s=selector.xpath("http://b[position()=1]/following-sibling::*")print(s.extract())s=selector.xpath("http://b[position()=1]/following-sibling::*[position()=1]")print(s.extract())例4-2-13:搜索后面的兄弟節(jié)點(diǎn)程序結(jié)果:['<b>B1</b>','<c>C1</c>','<d>D<e>E</e></d>','<b>B2</b>','<c>C2</c>']['<b>B1</b>']['<c>C1</c>','<d>D<e>E</e></d>','<b>B2</b>','<c>C2</c>']['<c>C1</c>']例如:s=selector.xpath("http://b[position()=1]/following-sibling::*[position()=1]")是搜索第一個(gè)<b>節(jié)點(diǎn)后面的第一個(gè)兄弟節(jié)點(diǎn),即<c>C1</c>節(jié)點(diǎn)。程序結(jié)果:12、xpath使用"element/preceding-sibling::*"搜索element前面的同級(jí)的所有兄弟節(jié)點(diǎn),使用"element/preceding-sibling::*[position()=1]"搜索element前面的同級(jí)的第一個(gè)兄弟節(jié)點(diǎn)。12、xpath使用"element/preceding-s例4-2-14:搜索前面的兄弟節(jié)點(diǎn)fromscrapy.selectorimportSelectorhtmlText="<a>A1</a><b>B1</b><c>C1</c><d>D<e>E</e></d><b>B2</b><c>C2</c>"selector=Selector(text=htmlText)s=selector.xpath("http://a/preceding-sibling::*")print(s.extract())s=selector.xpath("http://b/preceding-sibling::*[position()=1]")print(s.extract())s=selector.xpath("http://b[position()=2]/preceding-sibling::*")print(s.extract())s=selector.xpath("http://b[position()=2]/preceding-sibling::*[position()=1]")print(s.extract())例4-2-14:搜索前面的兄弟節(jié)點(diǎn)程序結(jié)果:[]['<a>A1</a>','<d>D<e>E</e></d>']['<a>A1</a>','<b>B1</b>','<c>C1</c>','<d>D<e>E</e></d>']['<d>D<e>E</e></d>']例如:s=selector.xpath("http://b/preceding-sibling::*[position()=1]")是所有<b>前面的第一個(gè)兄弟節(jié)點(diǎn),因?yàn)橛?個(gè)<b>節(jié)點(diǎn),因此結(jié)果是['<a>A1</a>','<d>D<e>E</e></d>']程序結(jié)果:4.2scrapy中查找HTML元素(1)4.2scrapy中查找HTML元素(1)在前面我們已經(jīng)知道使用BeautifulSoup能查找HTML中的元素,scrapy中也有強(qiáng)大的查找HTML元素的功能,那就是使用xpath方法。xpath方法使用XPath語(yǔ)法,比BeautifulSoup的select要靈活而且速度快。
在前面我們已經(jīng)知道使用BeautifulSoup能查找HTM例4-2-1:使用xpath查找HTML中的元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><book><titlelang="eng">HarryPotter</title><price>29.99</price></book><book><titlelang="eng">LearningXML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)print(type(selector));print(selector)s=selector.xpath("http://title")print(type(s))print(s)例4-2-1:使用xpath查找HTML中的元素程序結(jié)果:class'scrapy.selector.unified.Selector'><Selectorxpath=Nonedata='<html><body>\n<bookstore>\n<book>\n<title'><class'scrapy.selector.unified.SelectorList'>[<Selectorxpath='//title'data='<titlelang="eng">HarryPotter</title>'>,<Selectorxpath='//title'data='<titlelang="eng">LearningXML</title>'>]程序結(jié)果:(1)fromscrapy.selectorimportSelector從scrapy中引入Selector類(lèi),這個(gè)類(lèi)就是選擇查找類(lèi)。(2)selector=Selector(text=htmlText)使用htmlText的文字建立Selector類(lèi),就是裝載HTML文檔,文檔裝載后就形成一個(gè)Selector對(duì)象,就可以使用xpath查找元素。(3)print(type(selector)可看到selector是一個(gè)類(lèi)型為scrapy.selector.unified.Selector,這個(gè)類(lèi)型是一個(gè)有xpath方法的類(lèi)型。((1)fromscrapy.selectorimpor(4)s=selector.xpath("http://title")這個(gè)方法在文檔中查找所有的<title>的元素,其中"http://"表示文檔中的任何位置。一般地:selector.xpath("http://tagName")表示在權(quán)文檔中搜索<tagName>的tags,形成一個(gè)Selector的列表。(5)print(type(s))由于<title>有兩個(gè)元素,因此我們看到這是一個(gè)scrapy.selector.unified.SelectorList類(lèi),類(lèi)似scrapy.selector.unified.Selector的列表。(6)print(s)我們看到s包含兩個(gè)Selector對(duì)象,一個(gè)是<Selectorxpath='//title'data='<titlelang="eng">HarryPotter</title>'>,另外一個(gè)是<Selectorxpath='//title'data='<titlelang="eng">LearningXML</title>'>。<Selectorxpath='//title'data='<titlelang="eng">LearningXML</title>'>(4)s=selector.xpath("http://title"由此可見(jiàn)一般selector搜索一個(gè)<tagName>的HTML元素的方法是:selector.xpath("http://tagName")在裝載HTML文檔后selector=Selector(text=htmlText)得到的selector是對(duì)應(yīng)全文檔頂層的元素<html>的,其中"http://"表示全文檔搜索,結(jié)果是一個(gè)Selector的列表,哪怕只有一個(gè)元素也成一個(gè)列表,例如:selector.xpath("http://body")搜索到<body>元素,結(jié)果是一個(gè)Selector的列表,包含一個(gè)Selector元素;selector.xpath("http://title")搜索到兩個(gè)<title>元素,結(jié)果是Selector的列表,包含2個(gè)Selector元素;selector.xpath("http://book")搜索到兩個(gè)<book>元素,結(jié)果是Selector的列表,包含2個(gè)Selector元素;
由此可見(jiàn)一般selector搜索一個(gè)<tagName>的HT4.2scrapy中查找HTML元素(2)4.2scrapy中查找HTML元素(2)1、使用"http://"表示文檔下面的所有節(jié)點(diǎn)元素,用"/"表示當(dāng)前節(jié)點(diǎn)的下一級(jí)節(jié)點(diǎn)元素。
例4-2-2:"http://"與"/"的使用selector.xpath("http://bookstore/book")搜索<bookstore>下一級(jí)的<book>元素,找到2個(gè);selector.xpath("http://body/book")搜索<body>下一級(jí)的<book>元素,結(jié)果為空;selector.xpath("http://body//book")搜索<body>下<book>元素,找到2個(gè);selector.xpath("/body//book")搜索文檔下一級(jí)的<body>下的<book>元素,找結(jié)果為空,因?yàn)槲臋n的下一級(jí)是<html>元素,不是<body>元素;selector.xpath("/html/body//book")或者selector.xpath("/html//book")搜索<book>元素,找到2個(gè);selector.xpah("http://book/title")搜索文檔中所有<book>下一級(jí)的<title>元素,找到2個(gè),結(jié)果與selector.xpah("http://title")、selector.xpath("http://bookstore//title")一樣;selector.xpath("http://book//price")與selector.xpath("http://price")結(jié)果一樣,都是找到2個(gè)<price>元素;1、使用"http://"表示文檔下面的所有節(jié)點(diǎn)元素,用"/"表示當(dāng)前2、使用"."表示當(dāng)前節(jié)點(diǎn)元素,使用xpath可以連續(xù)調(diào)用,如果前一個(gè)xpath返回一個(gè)Selector的列表,那么這個(gè)列表可以繼續(xù)調(diào)用xpath,功能是為每個(gè)列表元素調(diào)用xpath,最后結(jié)果是全部元素調(diào)用xpath的匯總。
例4-2-3:使用"."進(jìn)行xpath連續(xù)調(diào)用fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><title>books</title><book><title>Novel</title><titlelang="eng">HarryPotter</title><price>29.99</price></book><book><title>TextBook</title><titlelang="eng">LearningXML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book").xpath("./title")foreins:print(e)2、使用"."表示當(dāng)前節(jié)點(diǎn)元素,使用xpath可以連續(xù)調(diào)用,程序結(jié)果:<Selectorxpath='//book/title'data='<title>Novel</title>'><Selectorxpath='//book/title'data='<titlelang="eng">HarryPotter</title>'><Selectorxpath='//book/title'data='<title>TextBook</title>'><Selectorxpath='//book/title'data='<titlelang="eng">LearningXML</title>'>我們看到selector.xpath("http://book")首先搜索到文檔中所有<book>元素,總共有2個(gè),然后再次調(diào)用xpath("./title"),就是從當(dāng)前元素<book>開(kāi)始往下一級(jí)搜索<title>,每個(gè)<book>都找到2個(gè)<title>,因此結(jié)果有4個(gè)<title>。程序結(jié)果:注意如果xpath連續(xù)調(diào)用時(shí)不指定是從前一個(gè)xpath的結(jié)果元素開(kāi)始的,那么默認(rèn)是從全文檔開(kāi)始的,結(jié)果會(huì)不一樣,例如:s=selector.xpath("http://book").xpath("/title")結(jié)果是空的,因?yàn)楹竺娴膞path("/title")從文檔開(kāi)始搜索<title>。s=selector.xpath("http://book").xpath("http://title")結(jié)果有10個(gè)元素,因?yàn)槊總€(gè)<book>都驅(qū)動(dòng)xpath("http://title")在全文檔搜索<title>元素,每次都搜索到5個(gè)元素。注意如果xpath連續(xù)調(diào)用時(shí)不指定是從前一個(gè)xpath的結(jié)果4.2scrapy中查找HTML元素(3)4.2scrapy中查找HTML元素(3)3、如果xpath返回的Selector對(duì)象列表,再次調(diào)用extract()函數(shù)會(huì)得到這些對(duì)象的元素文本的列表,使用extract_first()獲取列表中第一個(gè)元素值,如果列表為空extract_first()的值為None。而對(duì)于單一的一個(gè)Selector對(duì)象,調(diào)用extract()函數(shù)就可以得到Selector對(duì)象對(duì)應(yīng)的元素的文本值。單一的Selector對(duì)象沒(méi)有extract_first()函數(shù)。3、如果xpath返回的Selector對(duì)象列表,再次調(diào)用e例4-2-4:extract與extract_first函數(shù)使用fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/price")print(type(s),s)s=selector.xpath("http://book/price").extract()print(type(s),s)s=selector.xpath("http://book/price").extract_first()print(type(s),s)例4-2-4:extract與extract_first函數(shù)程序結(jié)果:<class'scrapy.selector.unified.SelectorList'>[<Selectorxpath='//book/price'data='<price>29.99</price>'>,<Selectorxpath='//book/price'data='<price>39.95</price>'>]<class'list'>['<price>29.99</price>','<price>39.95</price>']<class'str'><price>29.99</price>由此可見(jiàn):s=selector.xpath("http://book/price")得到的是SelectorList列表;s=selector.xpath("http://book/price").extract()得到的是<price>元素的Selector對(duì)象對(duì)應(yīng)的<price>元素的文本組成的列表,即:['<price>29.99</price>','<price>39.95</price>']s=selector.xpath("http://book/price").extrac_first()得到的是<price>元素的文本組成的列表的第一個(gè)元素,是一個(gè)文本,即:<price>29.99</price>程序結(jié)果:4、xpath使用"/@attrName"得到一個(gè)Selector元素的attrName屬性節(jié)點(diǎn)對(duì)象,屬性節(jié)點(diǎn)對(duì)象也是一個(gè)Selector對(duì)象,通過(guò)extract()獲取屬性值。
例4-2-5:獲取元素屬性值htmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/@id")print(s)print(s.extract())foreins:print(e.extract())4、xpath使用"/@attrName"得到一個(gè)Selec程序結(jié)果:[<Selectorxpath='//book/@id'data='b1'>,<Selectorxpath='//book/@id'data='b2'>]['b1','b2']b1b2由此可見(jiàn):s=selector.xpath("http://book/@id")結(jié)果是2個(gè)<book>的id屬性組成的SelectorList列表,即屬性也是一個(gè)Selector對(duì)象;print(s.extract())結(jié)果是<book>的id屬性的兩個(gè)Selector對(duì)象的屬性文本值的列表,即['b1','b2'];foreins:print(e.extract())每個(gè)e是一個(gè)Selector對(duì)象,因此extract()獲取對(duì)象的屬性值。程序結(jié)果:4.2scrapy中查找HTML元素(4)4.2scrapy中查找HTML元素(4)5、xpath使用"/text()"得到一個(gè)Selector元素包含的文本值,文本值節(jié)點(diǎn)對(duì)象也是一個(gè)Selector對(duì)象,通過(guò)extract()獲取文本值。
例:4-2-6:獲取節(jié)點(diǎn)的文本值fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/title/text()")print(s)print(s.extract())foreins:print(e.extract())5、xpath使用"/text()"得到一個(gè)Selector程序結(jié)果:[<Selectorxpath='//book/title/text()'data='HarryPotter'>,<Selectorxpath='//book/title/text()'data='學(xué)習(xí)XML'>]['HarryPotter','學(xué)習(xí)XML']HarryPotter學(xué)習(xí)XML
由此可見(jiàn):s=selector.xpath("http://book/title/text()")結(jié)果也是SelectorList列表,即文本也是一個(gè)節(jié)點(diǎn);print(s.extract())結(jié)果是文本節(jié)點(diǎn)的字符串值的列表,即['HarryPotter','學(xué)習(xí)XML'];foreins:print(e.extract())每個(gè)e是一個(gè)Selector對(duì)象,因此extract()獲取對(duì)象的屬性值。值得注意的是如果一個(gè)element的元素包含的文本不是單一的文本,那么可能會(huì)產(chǎn)生多個(gè)文本值。程序結(jié)果:例4-2-7:多個(gè)文本節(jié)點(diǎn)值fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english"><b>H</b>arry<b>P</b>otter</title><price>29.99</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/title/text()")print(s)print(s.extract())foreins:print(e.extract())例4-2-7:多個(gè)文本節(jié)點(diǎn)值程序結(jié)果:[<Selectorxpath='//book/title/text()'data='arry'>,<Selectorxpath='//book/title/text()'data='otter'>]['arry','otter']arryotter由此可見(jiàn)<title<中的文本值包含arry與otter兩個(gè)。程序結(jié)果:6、xpath使用"tag[condition]"來(lái)限定一個(gè)tag元素,其中condition是由這個(gè)tag的屬性、文本等計(jì)算出的一個(gè)邏輯值。如果有多個(gè)條件,那么可以寫(xiě)成:"tag[condition1][condition2]...[conditionN]"或者:"tag[condition1andcondition2and...andconditionN]"
6、xpath使用"tag[condition]"來(lái)限定一個(gè)例4-2-8:使用condition限定tag元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book/title[@lang='chinese']/text()")print(s.extract_first())s=selector.xpath("http://book[@id='b1']/title")print(s.extract_first())例4-2-8:使用condition限定tag元素程序結(jié)果:學(xué)習(xí)XML<titlelang="english">HarryPotter</title>由此可見(jiàn):s=selector.xpath("http://book/title[@lang='chinese']/text()")搜索<book>下面屬性lang="chinese"的<title>s=selector.xpath("http://book[@id='b1']/title")搜索屬性id="b1"的<book>下面的<title>。程序結(jié)果:4.2scrapy中查找HTML元素(5)4.2scrapy中查找HTML元素(5)7、xpath可以使用position()來(lái)確定其中一個(gè)元素的限制,這個(gè)選擇序號(hào)是從1開(kāi)始的,不是從0開(kāi)始編號(hào)的,還可以通過(guò)and、or等構(gòu)造復(fù)雜的表達(dá)式。
例4-2-9:使用position()序號(hào)來(lái)確定鎖選擇的元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book[position()=1]/title")print(s.extract_first())s=selector.xpath("http://book[position()=2]/title")print(s.extract_first())7、xpath可以使用position()來(lái)確定其中一個(gè)元素程序結(jié)果:<titlelang="english">HarryPotter</title><titlelang="chinese">學(xué)習(xí)XML</title>其中:s=selector.xpath("http://book[position()=1]/title")s=selector.xpath("http://book[position()=1]/title")分別選擇第一、二個(gè)<book>元素。程序結(jié)果:8、xpath使用星號(hào)"*"代表任何Element節(jié)點(diǎn),不包括Text、Comment的節(jié)點(diǎn)。例4-2-10:使用"*"代表任何element元素fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><bookid="b1"><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://bookstore/*/title")print(s.extract())8、xpath使用星號(hào)"*"代表任何Element節(jié)點(diǎn),不包程序結(jié)果:['<titlelang="english">HarryPotter</title>','<titlelang="chinese">學(xué)習(xí)XML</title>']其中s=selector.xpath("http://bookstore/*/title")是搜索<bookstore>的孫子節(jié)點(diǎn)<title>,中間隔開(kāi)一層任何元素。
程序結(jié)果:4.2scrapy中查找HTML元素(6)4.2scrapy中查找HTML元素(6)9、xpath使用"@*"代表任何屬性
例4-2-11:使用@*代表屬性fromscrapy.selectorimportSelectorhtmlText='''<html><body><bookstore><book><titlelang="english">HarryPotter</title><price>29.99</price></book><bookid="b2"><titlelang="chinese">學(xué)習(xí)XML</title><price>39.95</price></book></bookstore></body></html>'''selector=Selector(text=htmlText)s=selector.xpath("http://book[@*]/title")print(s.extract())s=selector.xpath("http://@*")print(s.extract())9、xpath使用"@*"代表任何屬性程序結(jié)果:['<titlelang="chinese">學(xué)習(xí)XML</title>']['english','b2','chine
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年綠色建筑材料交易合同規(guī)范匯編3篇
- 2025版微粒貸逾期8萬(wàn)元債權(quán)轉(zhuǎn)讓服務(wù)合同3篇
- 2025版外債借款合同匯率風(fēng)險(xiǎn)與應(yīng)對(duì)措施3篇
- 二零二五年度菜鳥(niǎo)驛站快遞業(yè)務(wù)數(shù)據(jù)分析合同3篇
- 二零二五年度多功能木方模板設(shè)計(jì)與制造服務(wù)合同4篇
- 2025年學(xué)生就業(yè)實(shí)習(xí)合同
- 2025年名譽(yù)權(quán)質(zhì)押合同
- 2025年合作加盟代理合資經(jīng)營(yíng)合同
- 二零二五版國(guó)際貨物檢驗(yàn)鑒定服務(wù)合同(木材)3篇
- 2025年家居中介代理協(xié)議
- 化學(xué)-河南省TOP二十名校2025屆高三調(diào)研考試(三)試題和答案
- 智慧農(nóng)貿(mào)批發(fā)市場(chǎng)平臺(tái)規(guī)劃建設(shè)方案
- 林下野雞養(yǎng)殖建設(shè)項(xiàng)目可行性研究報(bào)告
- 2023年水利部黃河水利委員會(huì)招聘考試真題
- Python編程基礎(chǔ)(項(xiàng)目式微課版)教案22
- 01J925-1壓型鋼板、夾芯板屋面及墻體建筑構(gòu)造
- 近五年重慶中考物理試題及答案2023
- 乳腺導(dǎo)管原位癌
- 冷庫(kù)管道應(yīng)急預(yù)案
- 《學(xué)習(xí)教育重要論述》考試復(fù)習(xí)題庫(kù)(共250余題)
- 網(wǎng)易云音樂(lè)用戶情感畫(huà)像研究
評(píng)論
0/150
提交評(píng)論