如何从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()
关键修改说明
- 通用类选择器替代标签选择器:用
.pw-post-title定位标题,这个类是Medium文章标题的通用标识,无论标题用h2还是div标签都能匹配,从根源解决标签不一致问题。 - 无效内容过滤:添加文本过滤逻辑,避免输出空字符串的无效元素。
- driver资源管理:将driver初始化移到类内部,每次调用后自动关闭,避免全局实例导致的资源浪费。
若后续遇到类名变更,可改用多标签选择器作为备选方案:
title_elements = self.driver.find_elements(By.CSS_SELECTOR, "h2, div") # 再通过文本长度、内容特征等进一步筛选有效标题
内容的提问来源于stack exchange,提问作者Karthik Bhandary
相关产品推荐
相关产品推荐

