在實務上開發專案時,很多時候會利用其他網站的資料來進行分析或運用,而取得的方式除了透過網站所提供的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)。
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。