LIHKG PRACTICE此頁面使用與真實 LIHKG 完全相同的 HTML 結構 — 練習後可直接用於爬取 lihkg.com← 返回練習首頁
🙂LIHKG
⌨ F5✏ 發表主題
吹水台
最新熱門
天下第一俊男剛剛👍0
1 頁
李知恩剛剛👍-48
30 頁
素人愛好者剛剛👍159
4 頁
What10?1 分鐘前👍4
6 頁
白花油大叔(48歲1 分鐘前👍1
2 頁
積極地消極1 分鐘前👍-116
5 頁
古天樂在其中2 分鐘前👍7
1 頁
極速神驅2 分鐘前👍-12
5 頁
情陷夜西環2 分鐘前👍10
8 頁
AppleDaily0624剛剛👍2300
17 頁
要靜去自修室啦屌3 分鐘前👍-15
2 頁
鳳凰城大腸3 分鐘前👍-5
1 頁
安全地移除下體4 分鐘前👍360
9 頁
愛之基篤桃4 分鐘前👍125
3 頁
通形百萬4 分鐘前👍1
5 頁
葉舒華隻DOG5 分鐘前👍-21
2 頁
唔鍾意著衫5 分鐘前👍-36
6 頁
佐治戰車6 分鐘前👍56
5 頁
要錢同女人5 分鐘前👍338
8 頁
乂二次方乂6 分鐘前👍0
18 頁
尊重啦屌你老母6 分鐘前👍-42
3 頁
日日食雞脾7 分鐘前👍-52
2 頁
里安尼遜7 分鐘前👍203
4 頁
咁係因為你樂觀7 分鐘前👍529
6 頁
鄧奕謙7 分鐘前👍2
1 頁
香港要獨立7 分鐘前👍29
4 頁
迴避型少女8 分鐘前👍17
1 頁
斧乃木余接8 分鐘前👍-63
5 頁
Miss_Dicky8 分鐘前👍4
16 頁
分類
吹水台娛樂台時事台創意台影視台飲食台感情台財經台旅遊台講故台動漫台硬件台玩具台
Python Scraper

如何用 Python 爬取 LIHKG

requests + lxml + XPath
Step 04用 XPath 解析靜態 HTML(核心練習)python
555">#fc8181">import requests
555">#fc8181">from lxml import html

555"># 方法:先用 requests-html 或 Selenium 渲染 JS,再用 XPath
555"># 這裡示範用已渲染的 HTML(例如從 Selenium 獲取)

555"># 假設 page_source 是已渲染的 HTML 字符串
555"># page_source = driver.page_source  # Selenium

555"># 解析 HTML
tree = html.fromstring(page_source)

555"># ── 用 XPath 提取每個帖子 ──
threads = tree.xpath(555">#f6e05e">'//div[contains(@class, "wQ4Ran")]')

results = []
555">#fc8181">for thread in threads:
    555"># 用戶名
    username = thread.xpath(
        555">#f6e05e">'.//span[contains(@class, "CxY4XDSSI")]/text()'
    )
    555"># 發帖時間
    time_posted = thread.xpath(
        555">#f6e05e">'.//span[contains(@class, "_37XwjAqV")][1]/text()'
    )
    555"># 點讚數(注意:likes span 包含 <i> 圖標,用 //text() 取所有文字)
    likes_parts = thread.xpath(
        555">#f6e05e">'.//span[contains(@class, "_37XwjAqV")][2]//text()'
    )
    likes = 555">#f6e05e">''.join(likes_parts).strip()
    555"># 頁數(text()[1] 跳過 <select> 內容)
    pages = thread.xpath(
        555">#f6e05e">'.//div[contains(@class, "_26oEXjfU")]/text()[1]'
    )
    555"># 帖子標題
    title = thread.xpath(
        555">#f6e05e">'.//span[contains(@class, "_20jopXBF")]/text()'
    )
    555"># 分類台名稱
    category = thread.xpath(
        555">#f6e05e">'.//a[contains(@class, "_3VRxq3mC")]/text()'
    )
    555"># 帖子 URL
    thread_url = thread.xpath(
        555">#f6e05e">'.//a[contains(@class, "_2A_7bGY9")]/@href'
    )

    results.append({
        555">#f6e05e">"username":   username[0].strip()   if username   else "",
        555">#f6e05e">"time":       time_posted[0].strip() if time_posted else "",
        555">#f6e05e">"likes":      likes,
        555">#f6e05e">"pages":      pages[0].strip()      if pages      else "1 頁",
        555">#f6e05e">"title":      title[0].strip()      if title      else "",
        555">#f6e05e">"category":   category[0].strip()   if category   else "",
        555">#f6e05e">"thread_url": "https://lihkg.com" + thread_url[0] if thread_url else "",
    })

555">#fc8181">print(f"提取了 {len(results)} 條帖子")
555">#fc8181">for r in results[:3]:
    555">#fc8181">print(r)
💡contains(@class, ...) 是關鍵技巧——LIHKG 的 class 是 hashed,用 contains 而非完全匹配
XPath → Python 對照表
字段XPath ExpressionPython 寫法返回類型
用戶名.//span[contains(@class,"CxY4XDSSI")]/text()thread.xpath('.//span[contains(@class,"CxY4XDSSI")]/text()')[0]str
發帖時間.//span[contains(@class,"_37XwjAqV")][1]/text()thread.xpath('.//span[contains(@class,"_37XwjAqV")][1]/text()')[0]str
點讚數.//span[contains(@class,"_37XwjAqV")][2]//text()''.join(thread.xpath(...))str (含圖標)
頁數.//div[contains(@class,"_26oEXjfU")]/text()[1]thread.xpath('.//div[contains(@class,"_26oEXjfU")]/text()[1]')[0]str
帖子標題.//span[contains(@class,"_20jopXBF")]/text()thread.xpath('.//span[contains(@class,"_20jopXBF")]/text()')[0]str
分類台.//a[contains(@class,"_3VRxq3mC")]/text()thread.xpath('.//a[contains(@class,"_3VRxq3mC")]/text()')[0]str
帖子 URL.//a[contains(@class,"_2A_7bGY9")]/@hrefthread.xpath('.//a[contains(@class,"_2A_7bGY9")]/@href')[0]str (相對路徑)
LIHKG XPath — 在 Console 輸入 $x("...")
先到 lihkg.com/category/1 再試
//div[contains(@class,"wQ4Ran")]
所有帖子
.//span[contains(@class,"CxY4XDSSI")]/text()
用戶名
.//span[contains(@class,"_37XwjAqV")][1]/text()
發帖時間
.//span[contains(@class,"_37XwjAqV")][2]//text()
點讚數
.//div[contains(@class,"_26oEXjfU")]/text()[1]
頁數
.//span[contains(@class,"_20jopXBF")]/text()
帖子標題
.//a[contains(@class,"_3VRxq3mC")]/text()
分類台
.//a[contains(@class,"_3VRxq3mC")]/@href
分類 URL
.//a[contains(@class,"_2A_7bGY9")]/@href
帖子 URL