来源:互联网 更新时间:2026-07-28 07:33
这件事的起点其实很单纯:输入一个网页链接,然后把正文干净地提取出来,顺便去掉导航、广告、侧边栏这些乱七八糟的东西,最后输出一个 Markdown 文件。
技术选型上,几个库直接锁定了方向:
初版代码实际上是 Doubao-Seed-Evolving 在一次对话中直接生成的,下面提炼的是关键实现路径和一些实际踩过的坑。
提示词扔进去,AI 直接给了这么一段核心结构:
import requests
from bs4 import BeautifulSoup
from readability import Document
import markdownify as md
DEFAULT_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."
def fetch_url(url, timeout=15, verify_ssl=True):
if not url.startswith(("http://", "https://")):
url = "https://" + url
headers = {"User-Agent": DEFAULT_UA}
resp = requests.get(url, headers=headers, timeout=timeout, verify=verify_ssl)
resp.raise_for_status()
return resp.text
def extract_markdown(html, page_url=""):
soup = BeautifulSoup(html, "lxml")
for tag in soup.find_all(["script", "style", "na v", "aside", "footer"]):
tag.decompose()
doc = Document(str(soup), url=page_url)
content_html = doc.summary()
return md(content_html, heading_style="ATX", convert=["table", "pre"])
这里有个坑:markdownify 不能同时传 convert 和 strip,否则运行时会直接报错。预清理已经处理了 script 和 style,所以把 strip 删掉就解决了。这个修复也是模型看到报错后给出的。
挑了三类不同类型的网页做测试,结果如实记录:
| 网站类型 | 结果 | 现象 |
|---|---|---|
| 技术博客(SSR) | ✅ | 代码块、语言标注、表格全保留 |
| 公众号 | ⚠️ | 正文 OK,标题变 [no-title] |
| 头条(CSR) | ❌ | 仅 # [no-title],正文空 |
三个网页,一个直接成功,一个丢标题,一个彻底空壳。第一版其实没有预想中那么惨,但真实的世界里,不同网站暴露出的问题组合起来,比预设的场景有意思多了。
readability-lxml 的 Document.summary() 不读 og:title,只取 。微信文章的标题格式恰好触发了它的解析 bug,结果就是 [no-title]。
修复其实不难:在 extract_markdown 之前加一层语义化标题提取,先做一轮自主判断。
def extract_title(soup, doc):
og = soup.find("meta", property="og:title")
if og and og.get("content"):
return og["content"].strip()
tw = soup.find("meta", attrs={"name": "twitter:title"})
if tw and tw.get("content"):
return tw["content"].strip()
h1 = soup.find("h1")
if h1 and h1.get_text(strip=True):
return h1.get_text(strip=True)
return doc.short_title()
头条这类站点,正文由 JS 异步加载,requests 拿到的只是 修复方案:加一个 另外,微信和头条的图片大多是懒加载,真实地址藏在 静态站不需要额外依赖,动态站加 黄金价格不断创新高!黄金稳定币XAU、PAXG市值达11亿美元 新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递 CC币价格预测(2026-2035):Canton币今日价格走势+长期价格预测 新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递 腾讯ima怎么创建共享知识库? 今日比特币暴涨分析:Metaplanet的比特币BTC投资推动股价上涨17% 蚂蚁庄园今日答案7月21日(今日已更新) 蚂蚁庄园今天正确答案是什么呢 腾讯ima怎么把微信内容一键导入知识库? 区块链OTC交易所有哪几家比较正规? 2026热门直线加速赛车手游推荐:高人气、爽快加速体验的精品榜单 kimi提示词专家使用方法新手指南 Intel喜讯连连:18A工艺良率提升到85%、CPU将涨价15% 原神霜月三处月灵龛具体位置汇总 《幻兽帕鲁》不触发通缉捕捉传说商人方法 Windy卫星云图怎么看?云层变化识别技巧 新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递 为什么推特KOL都在BRC20赚钱 我一冲就亏? 抖音怎么取消申请退货退款?抖音上取消退货怎么操作 一加手机如何设置三指长按屏幕局部截图 合集38个项目筹集5.406亿美元 Figure融资2亿--render 参数,用 Playwright 无头浏览器等渲染完成再提取。from playwright.sync_api import sync_playwright
def fetch_rendered(url):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(url, wait_until="networkidle")
html = page.content()
browser.close()
return html
data-src 里,需要补一段逻辑把 data-src 回填到 src,否则全文裂图。六、最终用法
python extract_article.py https://juejin.cn/post/xxx -o article.md
python extract_article.py https://www.toutiao.com/xxx --render -o toutiao.md
--render 就行,清晰明了。
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc