xpath(lxml 庫) 初始化etree對象 From lxml import etree ? text = '''? <div>? <ul>? <li class="item-0"><a href=”link1. html”>first item</a><li>? <li class=” item-1”>< a href=”link2.html”> second item</a><li>? <li class=” item-inactive” >< a href="link3.html”>third item</ a></h>? <li class=” item-1 item-0”><a href="link4.html'’>fourth item</a><li>? <li class =” item -0” id=“a”><a href=”link5.html”>fifth item</a>? </ul>? </div> '’’ //加載字符串?dāng)?shù)據(jù)或者響應(yīng)到的數(shù)據(jù) Html = etree.HTML(text)? ? //可以看到該字符串最后一個li標(biāo)簽沒有閉合,采用toString()方法修復(fù)該標(biāo)簽 Html = Etree.toString(html). ? ? 結(jié)果是bytes類型 ? //加載本地文件中的數(shù)據(jù)進行解析 Html = etree.parse(filepath,etree.HTMLParser()) ? ? //獲取上述text所有節(jié)點 etree.xpath(“//*”) ? //獲取第一個li節(jié)點 Etree.xpath(“/div/ul/li[1]”) ? ? //獲取第一個li標(biāo)簽內(nèi)a標(biāo)簽的文本數(shù)據(jù) Etree.xpath(//li[1][@class=“item-0”]/a[@href = “l(fā)ink1.html]/text()) ? ? //獲取li標(biāo)簽內(nèi)的子孫標(biāo)簽內(nèi)的文本數(shù)據(jù) Html.xpath(//li[@class=“item-0]//text()) ? ? //獲取父節(jié)點和屬性 Html.xpath(//a[@href=“l(fā)ink2.html”]/../@class) ? //有時某個節(jié)點的屬性有多個 Html.xpath(//li[contains(@class,”item1”)]/a/text()) ? ? //多屬性匹配 Html.xpath(//li[@class=“item-0” and? @id=“a”]/a/@href) ? ? //節(jié)點軸選擇 ancester::選擇器——-獲取當(dāng)前選中標(biāo)簽的所有父標(biāo)簽 child::選擇器———獲取所有選中節(jié)點的直接子節(jié)點 Attribute::選擇器——-獲取所有選中節(jié)點的屬性 ? ? ? ? Beautiful Soup庫 ? beautiful soup 會自動將輸入的文檔轉(zhuǎn)為unicode 編碼格式,自動將輸出的文檔轉(zhuǎn)為utf8的格式,無需考慮編碼的問題,除非文檔自身沒有指定編碼,指定一個編碼格式就ok (lxml解析器可以解析HTML,xml,解析的速度快,容錯能力強) ? ? //導(dǎo)入BeautifulSoup,lxml from bs4 import BeautifulSoup Import lxml ? ? ? //文本數(shù)據(jù) html = “”“ <html> <head>< title>The Dormouse ’s story</title></head>? <body>? <p class=”title" name="dromouse”>< b>The Dormouse ’s story</b></p>? <p class=”story’'>Once upon a time there were three little sisters; and their names were? <a href=” http:///elsie” class= " sister” id=”linkl”>< ! - Elsie … >< la>,? <a href=” http:///lacie ” class=”sister” id=”link2”> Lacie</a> and? <a href="http:///tillie" class=”sister” id=”link3 ”>Tillie</a> ;? and they lived at the bottom of a well .</p>? <p class=”story”> ... <Ip>? “”“ ? //初始化 From bs4 import BeautifulSoup //此步驟會將html中不標(biāo)準(zhǔn)的標(biāo)簽,進行標(biāo)準(zhǔn)化輸出 Soup = BeautifulSoup(html,’lxml) ? //將文檔以標(biāo)準(zhǔn)縮緊的格式輸出 print(soup.prettify()) ? ? //節(jié)點選擇,直接soup對象 節(jié)點名稱(標(biāo)簽名稱)就可以獲取該節(jié)點,獲取該節(jié)點的文本數(shù)據(jù)用string屬性 ? //獲取title節(jié)點 Soup.title ? //獲取title節(jié)點內(nèi)的文本數(shù)據(jù)string屬性或者get_text()方法,兩者功能完全一致 Soup.title.string ? //獲取p標(biāo)簽—-此時返回的是文檔中第一個p標(biāo)簽內(nèi)容(只會返回第一個選中的節(jié)點) Soup.p ? ? //調(diào)用name屬性返回節(jié)點的名稱(標(biāo)簽名稱) Soup.title.name ? //提取選中節(jié)點的屬性,attrs不攜帶屬性返回選中節(jié)點的所有屬性值,攜帶參數(shù)返回特定屬性值 Soup.p.attrs. ? //返回的是一個字典,如果一個屬性有多個值,那么該鍵所對應(yīng)的值是一個列表 Soup.p.attrs[“title”] ? ? //嵌套選擇—每個返回結(jié)果都是bs4.element.tag類型 //選擇head標(biāo)簽內(nèi)的title標(biāo)簽 Soup.head.title ? //contents屬性與children屬性,descendants ? //content與children屬性一致,返回選中節(jié)點內(nèi)的所有直接子節(jié)點,contents返回的是列表,children返回的是生成器 Soup.body.contents soup.body.children ? //descendants將返回選中節(jié)點的子孫節(jié)點,返回一個生成器 ? //獲取父節(jié)點 Soup.p.parent. ——直接父節(jié)點 soup.p.parents——返回所有的父節(jié)點和祖先節(jié)點。返回結(jié)果是一個生成器 ? //獲取兄弟節(jié)點 Soup.p.next_sibling —- soup.p.previous_sibling 返回的p節(jié)點的下一個和上一個兄弟節(jié)點 Soup.p.next_siblings ——soup.p.previous_siblings 返回的是所有的下兄弟節(jié)點和上兄弟節(jié)點 ? ? //方法選擇器 find_all(name,attrs,recursive,text,**kwargs) 返回需有符合條件的節(jié)點,返回結(jié)果是一個列表形式 ? //選擇節(jié)點名稱name soup.find_all(“p”) ? //選擇屬性,參數(shù)類型是字典形式 Soup.find_All(attrs={“id”:”aa”}) ? //text屬性可以傳入字符串或者正則表達(dá)式-返回節(jié)點中的文本符合該條件的文本列表 ? Soup.find_all(text=re.compile(“text”)) ? //find()方法與find_all接口一致,只不過find返回第一個匹配成功的節(jié)點,后者返回所有匹配的列表 ? ? //css選擇器 //select()方法返回所有符合css選擇器的節(jié)點列表—-也可以進行嵌套選擇 Soup.select(“#id .class tag”) ? //獲取屬性 Soup.ul[“id”]? ———-soup.ul.attrs[“id”] ? ? ? pyquery ? From pyquery import PyQuery as pq ? 初始化: Doc = PyQuery(參數(shù)):這里的參數(shù)可以是字符串,文件名(需要指定參數(shù)為filename),url(這里的url代表請求網(wǎng)頁的url,原理:先對該url發(fā)起請求,將獲得響應(yīng)對象的數(shù)據(jù)作為字符串參數(shù)參與初始化 ? 例如:PyQuery(url) 相當(dāng)于 PyQuery(requests.get(url).text) ? ? ? 選擇器的使用: 例如:doc(’#contain .abs p’) 代表選擇id為contain下class為abs下的p標(biāo)簽。 ? ? ? 查找子節(jié)點時需要用到find方法,傳入的參數(shù)時css選擇器(范圍時子孫節(jié)點) 例如 :ul = doc('.ul’) li? = ul.find(“l(fā)i”) 代表先選中calss為ul的標(biāo)簽,在獲取其下的li標(biāo)簽 ? ? 查找子節(jié)點的時候可以使用children方法(范圍是子節(jié)點) ? 例如:item.children() 返回item的所有子節(jié)點, Item.children(“#a”) 返回item中id為a的子節(jié)點 ? ? ? 查找父節(jié)點方法parent (只會返回直接點父節(jié)點,不會返回祖先節(jié)點) 例如:parent = item.parent() 返回item的父節(jié)點 ? ? 查找祖先節(jié)點parents 例如:item.parents() 返回父節(jié)點和所有的祖先節(jié)點 item.parents(“#a”) 返回id為a的祖先節(jié)點 ? 查找兄弟節(jié)點siblings方法 例如:item.siblings()返回item 的所有兄弟節(jié)點 item.siblings(“#a”) 返回item兄弟節(jié)點中id為a 的兄弟節(jié)點 遍歷:在調(diào)用相關(guān)方法后可能得到一個節(jié)點或多個節(jié)點,一個節(jié)點可以對其直接打印或轉(zhuǎn)為字符串,但多個節(jié)點需要用items()方法將其轉(zhuǎn)為生成器進行遍歷 ? ? 獲取節(jié)點的屬性attr()方法 例如 item.attr(“href) 或者 item.attr.href 效果相同,當(dāng)item是一個節(jié)點時,必然返回相應(yīng)的屬性值,但是如果item為多個節(jié)點,則只會返回第一個節(jié)點的屬性,如果想要返回所有節(jié)點的屬性,可以采用上述的遍歷的方法 ? ? 獲取節(jié)點的文本值和html文本 例如 item.text(), item.html() ,前者回返回當(dāng)前節(jié)點的所有文本數(shù)據(jù),在item為多個節(jié)點時同樣返回每個節(jié)點的文本數(shù)據(jù),每個節(jié)點之間的文本數(shù)據(jù)用空格分開,但html方法,在節(jié)點有一個的時候返回的是當(dāng)前節(jié)點內(nèi)的html文本,但在多個節(jié)點時只會返回第一個節(jié)點內(nèi)的html文本,所以在有多個節(jié)點時需要用到遍歷的方法 ? ? 修改節(jié)點的屬性 例如:addClass 為當(dāng)前節(jié)點添加一個class,removeClass 為當(dāng)前節(jié)點移除class Attr()方法傳入一個參數(shù)時獲取該屬性,傳入兩個參數(shù)時添加屬性,text()攜帶參數(shù)代表添加文本數(shù)據(jù)到當(dāng)前節(jié)點,html()攜帶參數(shù)代表添加html文本到當(dāng)前節(jié)點。 remove()方法移除選中的節(jié)點, ? 來源:https://www./content-4-893001.html |
|