使用Xpath
使用Xpath模塊
一、選取節(jié)點(diǎn)nodename 選取nodename節(jié)點(diǎn)的所有子節(jié)點(diǎn) xpath(‘//div’) 選取了所有div節(jié)點(diǎn) / 從根節(jié)點(diǎn)選取 xpath(‘/div’) 從根節(jié)點(diǎn)上選取div節(jié)點(diǎn) // 選取所有的當(dāng)前節(jié)點(diǎn),不考慮他們的位置 xpath(‘//div’) 選取所有的div節(jié)點(diǎn) . 選取當(dāng)前節(jié)點(diǎn) xpath(‘./div’) 選取當(dāng)前節(jié)點(diǎn)下的div節(jié)點(diǎn) .. 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) xpath(‘..’) 回到上一個(gè)節(jié)點(diǎn) @ 選取屬性 xpath(’//@calss’) 選取所有的class屬性'''ret=selector.xpath("//div") ret=selector.xpath("/div") ret=selector.xpath("./div") ret=selector.xpath("//p[@id='p1']") ret=selector.xpath("//div[@class='d1']/div/p[@class='story']")''' 二、謂語(yǔ)表達(dá)式 結(jié)果 xpath(‘/body/div[1]’) 選取body下的第一個(gè)div節(jié)點(diǎn) xpath(‘/body/div[last()]’) 選取body下最后一個(gè)div節(jié)點(diǎn) xpath(‘/body/div[last()-1]’) 選取body下倒數(shù)第二個(gè)div節(jié)點(diǎn) xpath(‘/body/div[positon()<3]’) 選取body下前兩個(gè)div節(jié)點(diǎn) xpath(‘/body/div[@class]’) 選取body下帶有class屬性的div節(jié)點(diǎn) xpath(‘/body/div[@class=”main”]’) 選取body下class屬性為main的div節(jié)點(diǎn) xpath(‘/body/div[@price>35.00]’) 選取body下price元素值大于35的div節(jié)點(diǎn)'''ret=selector.xpath("//p[@class='story']//a[2]") ret=selector.xpath("//p[@class='story']//a[last()]")''' 通配符 Xpath通過(guò)通配符來(lái)選取未知的XML元素表達(dá)式 結(jié)果 xpath(’/div/*’) 選取div下的所有子節(jié)點(diǎn) xpath(‘/div[@*]’) 選取所有帶屬性的div節(jié)點(diǎn)'''ret=selector.xpath("//p[@class='story']/*") ret=selector.xpath("//p[@class='story']/a[@class]")''' 四、取多個(gè)路徑 使用“|”運(yùn)算符可以選取多個(gè)路徑表達(dá)式 結(jié)果 xpath(‘//div|//table’) 選取所有的div和table節(jié)點(diǎn)'''ret=selector.xpath("//p[@class='story']/a[@class]|//div[@class='d3']") print(ret)'''五、Xpath軸 軸可以定義相對(duì)于當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)集軸名稱 表達(dá)式 描述 ancestor xpath(‘./ancestor::*’) 選取當(dāng)前節(jié)點(diǎn)的所有先輩節(jié)點(diǎn)(父、祖父) ancestor-or-self xpath(‘./ancestor-or-self::*’) 選取當(dāng)前節(jié)點(diǎn)的所有先輩節(jié)點(diǎn)以及節(jié)點(diǎn)本身 attribute xpath(‘./attribute::*’) 選取當(dāng)前節(jié)點(diǎn)的所有屬性 child xpath(‘./child::*’) 返回當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn) descendant xpath(‘./descendant::*’) 返回當(dāng)前節(jié)點(diǎn)的所有后代節(jié)點(diǎn)(子節(jié)點(diǎn)、孫節(jié)點(diǎn)) following xpath(‘./following::*’) 選取文檔中當(dāng)前節(jié)點(diǎn)結(jié)束標(biāo)簽后的所有節(jié)點(diǎn) following-sibing xpath(‘./following-sibing::*’) 選取當(dāng)前節(jié)點(diǎn)之后的兄弟節(jié)點(diǎn) parent xpath(‘./parent::*’) 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) preceding xpath(‘./preceding::*’) 選取文檔中當(dāng)前節(jié)點(diǎn)開始標(biāo)簽前的所有節(jié)點(diǎn)preceding-sibling xpath(‘./preceding-sibling::*’) 選取當(dāng)前節(jié)點(diǎn)之前的兄弟節(jié)點(diǎn) self xpath(‘./self::*’) 選取當(dāng)前節(jié)點(diǎn)六、功能函數(shù) 使用功能函數(shù)能夠更好的進(jìn)行模糊搜索函數(shù) 用法 解釋 starts-with xpath(‘//div[starts-with(@id,”ma”)]‘) 選取id值以ma開頭的div節(jié)點(diǎn) contains xpath(‘//div[contains(@id,”ma”)]‘) 選取id值包含ma的div節(jié)點(diǎn) and xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) 選取id值包含ma和in的div節(jié)點(diǎn) text() xpath(‘//div[contains(text(),”ma”)]‘) 選取節(jié)點(diǎn)文本包含ma的div節(jié)點(diǎn) Element對(duì)象class xml.etree.ElementTree.Element(tag, attrib={}, **extra)tag:string,元素代表的數(shù)據(jù)種類。text:string,元素的內(nèi)容。tail:string,元素的尾形。attrib:dictionary,元素的屬性字典。#針對(duì)屬性的操作clear():清空元素的后代、屬性、text和tail也設(shè)置為None。get(key, default=None):獲取key對(duì)應(yīng)的屬性值,如該屬性不存在則返回default值。items():根據(jù)屬性字典返回一個(gè)列表,列表元素為(key, value)。keys():返回包含所有元素屬性鍵的列表。set(key, value):設(shè)置新的屬性鍵與值。#針對(duì)后代的操作append(subelement):添加直系子元素。extend(subelements):增加一串元素對(duì)象作為子元素。#python2.7新特性find(match):尋找第一個(gè)匹配子元素,匹配對(duì)象可以為tag或path。findall(match):尋找所有匹配子元素,匹配對(duì)象可以為tag或path。findtext(match):尋找第一個(gè)匹配子元素,返回其text值。匹配對(duì)象可以為tag或path。insert(index, element):在指定位置插入子元素。iter(tag=None):生成遍歷當(dāng)前元素所有后代或者給定tag的后代的迭代器。#python2.7新特性iterfind(match):根據(jù)tag或path查找所有的后代。itertext():遍歷所有后代并返回text值。remove(subelement):刪除子元素。?
?
def get_page(url):import requestsheaders = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}response = requests.get(url,headers=headers)return response.textdef page_parse(response):from lxml import etreetree = etree.HTML(response)title_list = tree.xpath('//div[@class="title"]/a/text()')detail_list = tree.xpath('//div[@class="houseInfo"]/text()')price_list = [price.xpath('string(.)') for price in tree.xpath('//div[@class="totalPrice"]')]msg_list =[]for i in range(len(title_list)):dic = {"title":title_list[i],"detail":detail_list[i],"price":price_list[i]}msg_list.append(dic)return msg_listdef save_data(argv):import jsonwith open("lianjie.txt",'a',encoding='utf-8') as f:for i in argv:f.write(json.dumps(i,ensure_ascii=False)+"\n")def mycrawler():from concurrent.futures import ThreadPoolExecutorp = ThreadPoolExecutor(5)l = []for i in range(1,11):url = "https://sz.lianjia.com/ershoufang/pg%srs南山區(qū)/"%iresponse = p.submit(get_page, url)l.append(response.result())for k in l:msg_list = page_parse(k)save_data(msg_list)print("done")def main():mycrawler()if __name__ == '__main__':main() 爬取鏈家網(wǎng)?
轉(zhuǎn)載于:https://www.cnblogs.com/st-st/p/10307739.html
總結(jié)
- 上一篇: java基础-2
- 下一篇: Laravel 错误处理