您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Python如何定位元素”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python如何定位元素”吧!
確定網(wǎng)站沒(méi)有設(shè)置反爬措施,是否能直接返回待解析的內(nèi)容:
import requests url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text print(response)
仔細(xì)檢查后發(fā)現(xiàn)需要的數(shù)據(jù)都在返回內(nèi)容中,說(shuō)明不需要特別考慮反爬舉措
審查網(wǎng)頁(yè)元素后可以發(fā)現(xiàn),書目信息都包含在 li 中,從屬于 class 為 bang_list clearfix bang_list_mode 的 ul 中
進(jìn)一步審查也可以發(fā)現(xiàn)書名在的相應(yīng)位置,這是多種解析方法的重要基礎(chǔ)
1. 傳統(tǒng) BeautifulSoup 操作
經(jīng)典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通過(guò) soup = BeautifulSoup(html, "lxml") 將文本轉(zhuǎn)換為特定規(guī)范的結(jié)構(gòu),利用 find 系列方法進(jìn)行解析,代碼如下:
import requests from bs4 import BeautifulSoup url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def bs_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') # 鎖定ul后獲取20個(gè)li for li in li_list: title = li.find('div', class_='name').find('a')['title'] # 逐個(gè)解析獲取書名 print(title) if __name__ == '__main__': bs_for_parse(response)
成功獲取了 20 個(gè)書名,有些書面顯得冗長(zhǎng)可以通過(guò)正則或者其他字符串方法處理,本文不作詳細(xì)介紹
2. 基于 BeautifulSoup 的 CSS 選擇器
這種方法實(shí)際上就是 PyQuery 中 CSS 選擇器在其他模塊的遷移使用,用法是類似的。關(guān)于 CSS 選擇器詳細(xì)語(yǔ)法可以參考:http://www.w3school.com.cn/cssref/css_selectors.asp由于是基于 BeautifulSoup 所以導(dǎo)入的模塊以及文本結(jié)構(gòu)轉(zhuǎn)換都是一致的:
import requests from bs4 import BeautifulSoup url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def css_for_parse(response): soup = BeautifulSoup(response, "lxml") print(soup) if __name__ == '__main__': css_for_parse(response)
然后就是通過(guò) soup.select 輔以特定的 CSS 語(yǔ)法獲取特定內(nèi)容,基礎(chǔ)依舊是對(duì)元素的認(rèn)真審查分析:
import requests from bs4 import BeautifulSoup from lxml import html url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def css_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li') for li in li_list: title = li.select('div.name > a')[0]['title'] print(title) if __name__ == '__main__': css_for_parse(response)
3. XPath
XPath 即為 XML 路徑語(yǔ)言,它是一種用來(lái)確定 XML 文檔中某部分位置的計(jì)算機(jī)語(yǔ)言,如果使用 Chrome 瀏覽器建議安裝 XPath Helper 插件,會(huì)大大提高寫 XPath 的效率。
之前的爬蟲文章基本都是基于 XPath,大家相對(duì)比較熟悉因此代碼直接給出:
import requests from lxml import html url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def xpath_for_parse(response): selector = html.fromstring(response) books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li") for book in books: title = book.xpath('div[@class="name"]/a/@title')[0] print(title) if __name__ == '__main__': xpath_for_parse(response)
4. 正則表達(dá)式如果對(duì) HTML 語(yǔ)言不熟悉,那么之前的幾種解析方法都會(huì)比較吃力。這里也提供一種萬(wàn)能解析大法:正則表達(dá)式,只需要關(guān)注文本本身有什么特殊構(gòu)造文法,即可用特定規(guī)則獲取相應(yīng)內(nèi)容。依賴的模塊是 re
首先重新觀察直接返回的內(nèi)容中,需要的文字前后有什么特殊:
import requests import re url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text print(response)
觀察幾個(gè)數(shù)目相信就有答案了:<div class="name"><a href="http://product.dangdang.com/xxxxxxxx.html" target="_blank" title="xxxxxxx">
書名就藏在上面的字符串中,蘊(yùn)含的網(wǎng)址鏈接中末尾的數(shù)字會(huì)隨著書名而改變。
分析到這里正則表達(dá)式就可以寫出來(lái)了:
import requests import re url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def re_for_parse(response): reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">' for title in re.findall(reg, response): print(title) if __name__ == '__main__': re_for_parse(response)
可以發(fā)現(xiàn)正則寫法是最簡(jiǎn)單的,但是需要對(duì)于正則規(guī)則非常熟練。所謂正則大法好!
當(dāng)然,不論哪種方法都有它所適用的場(chǎng)景,在真實(shí)操作中我們也需要在分析網(wǎng)頁(yè)結(jié)構(gòu)來(lái)判斷如何高效的定位元素,最后附上本文介紹的四種方法的完整代碼,大家可以自行操作一下來(lái)加深體會(huì)
import requests from bs4 import BeautifulSoup from lxml import html import re url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def bs_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') for li in li_list: title = li.find('div', class_='name').find('a')['title'] print(title) def css_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li') for li in li_list: title = li.select('div.name > a')[0]['title'] print(title) def xpath_for_parse(response): selector = html.fromstring(response) books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li") for book in books: title = book.xpath('div[@class="name"]/a/@title')[0] print(title) def re_for_parse(response): reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">' for title in re.findall(reg, response): print(title) if __name__ == '__main__': # bs_for_parse(response) # css_for_parse(response) # xpath_for_parse(response) re_for_parse(response)
到此,相信大家對(duì)“Python如何定位元素”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。