靜態網頁擷取

郭耀仁

先安裝 chrome 外掛

CSS 選擇

  • 利用文件物件模型(Document Object Model, DOM)選擇網頁元素的技巧

CSS 選擇(2)

CSS 選擇(3)

  • 點選 SelectorGadget 的外掛圖示
  • 先點選評等(Rating)

CSS 選擇(4)

  • 會有多個元素被選出(標註黃色),因為這頁有很多 <span></span>

CSS 選擇(5)

  • 接著點選不要的元素(標註紅色)

CSS 選擇(6)

  • 這時我們就得到正確的 CSS 選擇:strong span

CSS 選擇(7)

  • 再練習一次,這次我們要將這頁的演員名單(Cast)擷取出來:

CSS 選擇(8)

  • 先點選男主角 Ryan Gosling
  • 乍看之下好像 .itemprop 這個類別就對了

CSS 選擇(9)

  • 但是其實其他的元素也有使用 .itemprop 這個類別

CSS 選擇(10)

  • 於是點選不要的元素(標註紅色)

CSS 選擇(11)

  • 這時我們就得到正確的 CSS 選擇:.itemprop .itemprop

Pyquery

  • 用來解析 HTML 與 XML 檔案的 Python 模組
  • 先在終端機安裝模組
# Local
pip install pyquery # terminal
# Google Colab
!pip install pyquery # cell
In [1]:
from pyquery import PyQuery as pq

lalaland_url = "http://www.imdb.com/title/tt3783958/"
html_doc = pq(lalaland_url)
html_doc.contents()
Out[1]:
['\n    ', <Element head at 0x109ed3778>, '\n    ', <Element body at 0x109ed3818>, '\n']
In [2]:
rating_css = "strong span"
print(html_doc(rating_css))
print(html_doc(rating_css).text())
<span itemprop="ratingValue">8.1</span>
8.1
In [3]:
lalaland_rating = html_doc(rating_css).text()
type(lalaland_rating)
Out[3]:
str

隨堂練習:從網頁中擷取出電影類型

http://www.imdb.com/title/tt3783958/

In [5]:
get_genre()
Out[5]:
['Comedy', 'Drama', 'Music']

隨堂練習:從網頁中擷取出演員名單

http://www.imdb.com/title/tt3783958/

In [7]:
get_cast()
Out[7]:
['Ryan Gosling',
 'Emma Stone',
 'Amiée Conn',
 'Terry Walters',
 'Thom Shelton',
 'Cinda Adams',
 'Callie Hernandez',
 'Jessica Rothe',
 'Sonoya Mizuno',
 'Rosemarie DeWitt',
 'J.K. Simmons',
 'Claudine Claudio',
 'Jason Fuchs',
 'D.A. Wallach']