You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Medium平台的h2或div标签中提取文章标题?

解决Medium专栏文章标题标签兼容问题

核心思路

Medium不同专栏的文章标题虽标签不同,但大多共用统一的类名(比如pw-post-title),直接通过类选择器定位就能兼容不同标签的情况;如果后续类名变动,也可同时指定多个标签选择器并过滤无效内容。

修改后的代码

import requests
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time


class Publication:
    def __init__(self, link):
        self.link = link
        # 将driver初始化封装到类内部,避免全局实例资源泄漏
        self.options = Options()
        self.options.add_argument("--headless")
        self.options.add_argument('--log-level=3')
        self.options.add_experimental_option('excludeSwitches', ['enable-logging'])
        self.driver = webdriver.Chrome(options=self.options)

    def get_articles(self):
        """获取指定专栏的所有文章标题"""
        self.driver.get(self.link)
        scroll_pause = 0.5
        last_height = self.driver.execute_script("return document.documentElement.scrollHeight")
        run_time, max_run_time = 0, 1

        while True:
            iteration_start = time.time()
            self.driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
            time.sleep(scroll_pause)

            new_height = self.driver.execute_script("return document.documentElement.scrollHeight")
            scrolled = new_height != last_height
            timed_out = run_time >= max_run_time

            if scrolled:
                run_time = 0
                last_height = new_height
            elif not scrolled and not timed_out:
                run_time += time.time() - iteration_start
            else:
                break

        # 关键修改:通过Medium通用标题类定位,兼容h2和div标签
        title_elements = self.driver.find_elements(By.CSS_SELECTOR, ".pw-post-title")
        # 过滤空文本的无效元素
        article_titles = [elem.text.strip() for elem in title_elements if elem.text.strip()]
        
        # 输出标题并返回结果
        for title in article_titles:
            print(title)
        
        self.driver.quit()
        return article_titles

# 测试示例
if __name__ == "__main__":
    # 测试h2标签的专栏
    pub1 = Publication("https://towardsdatascience.com")
    pub1.get_articles()
    
    # 测试div标签的专栏
    pub2 = Publication("https://levelup.gitconnected.com")
    pub2.get_articles()

关键修改说明

  1. 通用类选择器替代标签选择器:用.pw-post-title定位标题,这个类是Medium文章标题的通用标识,无论标题用h2还是div标签都能匹配,从根源解决标签不一致问题。
  2. 无效内容过滤:添加文本过滤逻辑,避免输出空字符串的无效元素。
  3. driver资源管理:将driver初始化移到类内部,每次调用后自动关闭,避免全局实例导致的资源浪费。

若后续遇到类名变更,可改用多标签选择器作为备选方案:

title_elements = self.driver.find_elements(By.CSS_SELECTOR, "h2, div")
# 再通过文本长度、内容特征等进一步筛选有效标题

内容的提问来源于stack exchange,提问作者Karthik Bhandary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:58:31