104學習

Mike Ku

Learn Code With Mike品牌創辦人

2021/10/15

Python使用BS4開發網頁爬蟲的技巧(下)

在實務上開發專案時,很多時候會利用其他網站的資料來進行分析或運用,而取得的方式除了透過網站所提供的API(Application Programming Interface)外,也可以利用Python來開發爬蟲程式,將網頁的HTML內容下載下來,接著利用BeautifulSoup套件(Package),擷取所需的資訊。
本文就來接續「Python使用BS4開發網頁爬蟲的技巧(上)」文章,來和大家繼續分享Python使用BS4開發網頁爬蟲的更多技巧。
Q:如何利用Python的BeautifulSoup套件搜尋前、後節點?
在同一層級的節點,想要搜尋前一個節點,可以使用BeautifulSoup套件(Package)的find_previous_siblings()方法,如下範例:
result = soup.find("h3", itemprop="headline").find_previous_siblings("a")
相反的,在同一層級的節點,想要搜尋後一個節點,則使用find_next_siblings()方法(Method),如下範例:
result = soup.find("h3", itemprop="headline").find_next_siblings("p")
Q:Python的BeautifulSoup套件的取得屬性值方法?
在前面範例中,皆為取得所需之HTML節點,而如果想要取得某一個節點中的屬性值,則可以利用BeautifulSoup套件(Package)的get()方法(Method)。
假設,想要爬取「ETtoday的旅遊雲」桃園景點首頁( https://travel.ettoday.net/category/%E6%A1%83%E5%9C%92/ )的標題連結。首先,利用find_all()方法搜尋網頁中所有<h3>標籤且itemprop屬性值為headline的節點,接著,透過for迴圈讀取串列(List)中的節點,由於<h3>標籤底下只有一個<a>標籤,所以可以利用BeautifulSoup套件的select_one()方法進行選取,如下範例:
titles = soup.find_all("h3", itemprop="headline")
for title in titles:
print(title.select_one("a"))
最後,利用get()方法(Method)取得href屬性值中的網址,如下範例:
titles = soup.find_all("h3", itemprop="headline")
for title in titles:
print(title.select_one("a").get("href"))
Q:Python的BeautifulSoup套件如何爬取超連結的文字
要取得<a>標籤的連結文字,可以利用BeautifulSoup套件(Package)的getText()方法(Method),如下範例:
titles = soup.find_all("h3", itemprop="headline")
for title in titles:
print(title.select_one("a").getText())
Q: find/find_all與select_one/select這兩種方法的差別和適合的使用時機是?
1.兩者的定位元素語法不同,select_one/select使用CSS的語法來進行元素定位。
2.find = select_one,皆是取得單一元素
find_all = select,皆是取得多個元素
3.find/find_all與select_one/select最大的差別就是語法不同,所以取決於您習慣哪一種語法來進行元素定位,如果要嚴格區分使用時機的話,通常select_one/select會使用在以class樣式類別來進行元素定位,或是定位元素的層級較多的情況,其餘會使用find/find_all。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/02/python-beautifulsoup-web-scraper.html )網站觀看更多精彩內容。
0 0 1243 0