热门搜索:和平精英 原神 街篮2 

您的位置:首页 > > 教程攻略 > ai教程 >用 Doubao-Seed-Evolving + Python 免费写一个网页正文提取工具(实战教程)

用 Doubao-Seed-Evolving + Python 免费写一个网页正文提取工具(实战教程)

来源:互联网 更新时间:2026-07-28 07:33

一、需求与技术选型

这件事的起点其实很单纯:输入一个网页链接,然后把正文干净地提取出来,顺便去掉导航、广告、侧边栏这些乱七八糟的东西,最后输出一个 Markdown 文件。

技术选型上,几个库直接锁定了方向:

  • readability(readability-lxml)

    负责正文去噪,核心引擎
  • markdownify

    把清洗后的 HTML 转成 Markdown,省事
  • BeautifulSoup

    做预清理,先干掉一些明显不需要的标签
  • Playwright

    用来应付那些需要客户端渲染的页面

初版代码实际上是 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 不能同时传 convertstrip,否则运行时会直接报错。预清理已经处理了 script 和 style,所以把 strip 删掉就解决了。这个修复也是模型看到报错后给出的。

三、实测三类网站

挑了三类不同类型的网页做测试,结果如实记录:

网站类型结果现象
技术博客(SSR)代码块、语言标注、表格全保留
公众号⚠️正文 OK,标题变 [no-title]
头条(CSR)仅 # [no-title],正文空

三个网页,一个直接成功,一个丢标题,一个彻底空壳。第一版其实没有预想中那么惨,但真实的世界里,不同网站暴露出的问题组合起来,比预设的场景有意思多了。

四、关键修复一:标题提取退化

readability-lxml 的 Document.summary() 不读 og:title,只取 </code>。微信文章的标题格式恰好触发了它的解析 bug,结果就是 <code>[no-title]</code>。</p> <p>修复其实不难:在 <code>extract_markdown</code> 之前加一层语义化标题提取,先做一轮自主判断。</p> <pre><code>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() </code></pre> <h2>五、关键修复二:客户端渲染站点的空壳</h2> <p>头条这类站点,正文由 JS 异步加载,requests 拿到的只是 <code><div id="root"></code> 一个空壳。</p> <p>修复方案:加一个 <code>--render</code> 参数,用 Playwright 无头浏览器等渲染完成再提取。</p> <pre><code>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 </code></pre> <p>另外,微信和头条的图片大多是懒加载,真实地址藏在 <code>data-src</code> 里,需要补一段逻辑把 <code>data-src</code> 回填到 <code>src</code>,否则全文裂图。</p> <h2>六、最终用法</h2> <pre><code>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 </code></pre> <p>静态站不需要额外依赖,动态站加 <code>--render</code> 就行,清晰明了。</p> </div> <div class="ccRmzxBox"> <div class="ccRmglTitle"> <b></b> <h2>热门资讯</h2> <a href="http://www.haoling.cc/wenzhang_list/53-1.html"></a> <div class="clear"></div> </div> <ul class="ccRmzxList"> <li> <a href="http://www.haoling.cc/wenzhang/662506/" class="aBlack"> <b></b> <p>黄金价格不断创新高!黄金稳定币XAU、PAXG市值达11亿美元</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/668939/" class="aBlack"> <b></b> <p>新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/660159/" class="aBlack"> <b></b> <p>CC币价格预测(2026-2035):Canton币今日价格走势+长期价格预测</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/671153/" class="aBlack"> <b></b> <p>新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/675782/" class="aBlack"> <b></b> <p>腾讯ima怎么创建共享知识库?</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/656211/" class="aBlack"> <b></b> <p>今日比特币暴涨分析:Metaplanet的比特币BTC投资推动股价上涨17%</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/657636/" class="aBlack"> <b></b> <p>蚂蚁庄园今日答案7月21日(今日已更新) 蚂蚁庄园今天正确答案是什么呢</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/675778/" class="aBlack"> <b></b> <p>腾讯ima怎么把微信内容一键导入知识库?</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/640260/" class="aBlack"> <b></b> <p>区块链OTC交易所有哪几家比较正规?</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/644246/" class="aBlack"> <b></b> <p>2026热门直线加速赛车手游推荐:高人气、爽快加速体验的精品榜单</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/685379/" class="aBlack"> <b></b> <p>kimi提示词专家使用方法新手指南</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/644675/" class="aBlack"> <b></b> <p>Intel喜讯连连:18A工艺良率提升到85%、CPU将涨价15%</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/650405/" class="aBlack"> <b></b> <p>原神霜月三处月灵龛具体位置汇总</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/668130/" class="aBlack"> <b></b> <p>《幻兽帕鲁》不触发通缉捕捉传说商人方法</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/682725/" class="aBlack"> <b></b> <p>Windy卫星云图怎么看?云层变化识别技巧</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/686728/" class="aBlack"> <b></b> <p>新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/654499/" class="aBlack"> <b></b> <p>为什么推特KOL都在BRC20赚钱 我一冲就亏?</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/655488/" class="aBlack"> <b></b> <p>抖音怎么取消申请退货退款?抖音上取消退货怎么操作</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/669034/" class="aBlack"> <b></b> <p>一加手机如何设置三指长按屏幕局部截图</p> <div class="clear"></div> </a> </li> <li> <a href="http://www.haoling.cc/wenzhang/675325/" class="aBlack"> <b></b> <p>合集38个项目筹集5.406亿美元 Figure融资2亿</p> <div class="clear"></div> </a> </li> <div class="clear"></div> </ul> </div> </div> <!--宸﹁竟 end--> <!--鍙宠竟--> <div class="ccRight"> <div class="ccYxphBox"> <div class="ccRmglTitle"> <b></b> <h2>热门手游</h2> <a href="http://www.haoling.cc/sjyx_list/38-1-1.html"></a> <div class="clear"></div> </div> <ul class="ccYxphList"> </ul> </div> <div class="ccYxphBox"> <div class="ccRmglTitle"> <b></b> <h2>相关攻略</h2> <a href="http://www.haoling.cc/wenzhang_list/53-1.html"></a> <div class="clear"></div> </div> <ul class="ccXgglList djScList"> <li> <div class="ccXgglCont1 hover1" > <span class="bg1">1</span> <a href="http://www.haoling.cc/wenzhang/658257/" title="LoopGain:开源Python AI环路增益监控工具,动态管控智能体迭代循环" class="aBlack">LoopGain:开源Python AI环路增益监控工具,动态管控智能体迭代循环</a> <em>07-21</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg1">1</span> <a href="http://www.haoling.cc/wenzhang/658257/" title="LoopGain:开源Python AI环路增益监控工具,动态管控智能体迭代循环"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/658257/" title="LoopGain:开源Python AI环路增益监控工具,动态管控智能体迭代循环" class="aBlack">LoopGain:开源Python AI环路增益监控工具,动态管控智能体迭代循环</a></dt> <dd><b></b>07-21</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg2">2</span> <a href="http://www.haoling.cc/wenzhang/660711/" title="OMPS-N20 L2 NM 甲醛 (HCHO) 总柱扫描轨道" class="aBlack">OMPS-N20 L2 NM 甲醛 (HCHO) 总柱扫描轨道</a> <em>07-22</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg2">2</span> <a href="http://www.haoling.cc/wenzhang/660711/" title="OMPS-N20 L2 NM 甲醛 (HCHO) 总柱扫描轨道"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/660711/" title="OMPS-N20 L2 NM 甲醛 (HCHO) 总柱扫描轨道" class="aBlack">OMPS-N20 L2 NM 甲醛 (HCHO) 总柱扫描轨道</a></dt> <dd><b></b>07-22</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg3">3</span> <a href="http://www.haoling.cc/wenzhang/661002/" title="Python和RPA的区别" class="aBlack">Python和RPA的区别</a> <em>07-22</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg3">3</span> <a href="http://www.haoling.cc/wenzhang/661002/" title="Python和RPA的区别"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/661002/" title="Python和RPA的区别" class="aBlack">Python和RPA的区别</a></dt> <dd><b></b>07-22</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg4">4</span> <a href="http://www.haoling.cc/wenzhang/665587/" title="RPA和Python在数据抓取方面有什么不同" class="aBlack">RPA和Python在数据抓取方面有什么不同</a> <em>07-24</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg4">4</span> <a href="http://www.haoling.cc/wenzhang/665587/" title="RPA和Python在数据抓取方面有什么不同"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/665587/" title="RPA和Python在数据抓取方面有什么不同" class="aBlack">RPA和Python在数据抓取方面有什么不同</a></dt> <dd><b></b>07-24</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg4">5</span> <a href="http://www.haoling.cc/wenzhang/667729/" title="Python语言下网络爬虫的技术特点及应用" class="aBlack">Python语言下网络爬虫的技术特点及应用</a> <em>07-25</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg4">5</span> <a href="http://www.haoling.cc/wenzhang/667729/" title="Python语言下网络爬虫的技术特点及应用"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/667729/" title="Python语言下网络爬虫的技术特点及应用" class="aBlack">Python语言下网络爬虫的技术特点及应用</a></dt> <dd><b></b>07-25</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg4">6</span> <a href="http://www.haoling.cc/wenzhang/668869/" title="【LangChain学习笔记】Python环境搭建" class="aBlack">【LangChain学习笔记】Python环境搭建</a> <em>07-26</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg4">6</span> <a href="http://www.haoling.cc/wenzhang/668869/" title="【LangChain学习笔记】Python环境搭建"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/668869/" title="【LangChain学习笔记】Python环境搭建" class="aBlack">【LangChain学习笔记】Python环境搭建</a></dt> <dd><b></b>07-26</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg4">7</span> <a href="http://www.haoling.cc/wenzhang/679052/" title="RPA和Python哪个更好用" class="aBlack">RPA和Python哪个更好用</a> <em>07-30</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg4">7</span> <a href="http://www.haoling.cc/wenzhang/679052/" title="RPA和Python哪个更好用"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/679052/" title="RPA和Python哪个更好用" class="aBlack">RPA和Python哪个更好用</a></dt> <dd><b></b>07-30</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg4">8</span> <a href="http://www.haoling.cc/wenzhang/681077/" title="通义灵码代码补全怎么在Python项目使用?" class="aBlack">通义灵码代码补全怎么在Python项目使用?</a> <em>07-31</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg4">8</span> <a href="http://www.haoling.cc/wenzhang/681077/" title="通义灵码代码补全怎么在Python项目使用?"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/681077/" title="通义灵码代码补全怎么在Python项目使用?" class="aBlack">通义灵码代码补全怎么在Python项目使用?</a></dt> <dd><b></b>07-31</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg4">9</span> <a href="http://www.haoling.cc/wenzhang/683273/" title="通义灵码怎么用中文生成Python代码?" class="aBlack">通义灵码怎么用中文生成Python代码?</a> <em>08-01</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg4">9</span> <a href="http://www.haoling.cc/wenzhang/683273/" title="通义灵码怎么用中文生成Python代码?"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/683273/" title="通义灵码怎么用中文生成Python代码?" class="aBlack">通义灵码怎么用中文生成Python代码?</a></dt> <dd><b></b>08-01</dd> </dl> <div class="clear"></div> </div> </li> <li> <div class="ccXgglCont1 hover1" > <span class="bg4">10</span> <a href="http://www.haoling.cc/wenzhang/693443/" title="装Hermes_Agent_v0.19.0时Python版本不对怎么办" class="aBlack">装Hermes_Agent_v0.19.0时Python版本不对怎么办</a> <em>08-06</em> <div class="clear"></div> </div> <div class="ccXgglCont2 hover2" style="display:none;"> <span class="bg4">10</span> <a href="http://www.haoling.cc/wenzhang/693443/" title="装Hermes_Agent_v0.19.0时Python版本不对怎么办"></a> <dl> <dt><a href="http://www.haoling.cc/wenzhang/693443/" title="装Hermes_Agent_v0.19.0时Python版本不对怎么办" class="aBlack">装Hermes_Agent_v0.19.0时Python版本不对怎么办</a></dt> <dd><b></b>08-06</dd> </dl> <div class="clear"></div> </div> </li> </ul> </div> <div class="ccYxphBox"> <div class="ccRmglTitle"> <b></b> <h2>热门专题</h2> <a href="http://www.haoling.cc/heji/p_1/"></a> <div class="clear"></div> </div> <ul class="ccRmztList"> <li> <a href="http://www.haoling.cc/heji/xunixiaozhenyx/" title="虚拟小镇游戏" class="aWhite"> <div class="ccRmztCont1"> <img src="http://www.haoling.cc/uploadfile/2022/1128/20221128030923126.png" alt="虚拟小镇游戏"/> <span><p>虚拟小镇游戏</p></span> </div> <div class="ccRmztCont2"> <span><b class="icon1"></b><p>虚拟小镇游戏</p><b class="icon2"></b></span> <em>绔嬪嵆鏌ョ湅</em> </div> </a> </li> <li> <a href="http://www.haoling.cc/heji/dpgyxzwb/" title="打屁股游戏中文版" class="aWhite"> <div class="ccRmztCont1"> <img src="http://www.haoling.cc/uploadfile/2021/0622/20210622080344898.jpg" alt="打屁股游戏中文版"/> <span><p>打屁股游戏中文版</p></span> </div> <div class="ccRmztCont2"> <span><b class="icon1"></b><p>打屁股游戏中文版</p><b class="icon2"></b></span> <em>绔嬪嵆鏌ョ湅</em> </div> </a> </li> <li> <a href="http://www.haoling.cc/heji/lhhhzyxhjzz/" title="冷狐汉化组游戏合集直装" class="aWhite"> <div class="ccRmztCont1"> <img src="http://www.haoling.cc/uploadfile/2023/0914/20230914051554654.jpg" alt="冷狐汉化组游戏合集直装"/> <span><p>冷狐汉化组游戏合集直装</p></span> </div> <div class="ccRmztCont2"> <span><b class="icon1"></b><p>冷狐汉化组游戏合集直装</p><b class="icon2"></b></span> <em>绔嬪嵆鏌ョ湅</em> </div> </a> </li> <li> <a href="http://www.haoling.cc/heji/hwdyxmn/" title="很污3D模拟养成游戏手游大全" class="aWhite"> <div class="ccRmztCont1"> <img src="http://www.haoling.cc/uploadfile/2021/0224/20210224100712905.jpg" alt="很污3D模拟养成游戏手游大全"/> <span><p>很污3D模拟养成游戏手游大全</p></span> </div> <div class="ccRmztCont2"> <span><b class="icon1"></b><p>很污3D模拟养成游戏手游大全</p><b class="icon2"></b></span> <em>绔嬪嵆鏌ョ湅</em> </div> </a> </li> </ul> </div> </div> <!--鍙宠竟 end--> <div class="clear"></div> </div> <!--涓讳綋 end--> <!--底部--> <div class="ccFoot"> <div class="ccFootIn"> <p> <a href="/" title="手机号码测吉凶">手机号码测吉凶</a> <br> 本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc <!-- <a href="https://beian.miit.gov.cn/" style="color:#FFFFFF ;text-decoration: none" rel="nofollow">湘ICP备2020018889号</a> --> </p> <div class="clear"></div> </div> </div> <script type="text/javascript" src="/js/jquery.min.js"></script> <script type="text/javascript" src="/tongji.js"></script> <script src="/js/jquery.cookie.js"></script> <script language="JavaScript" src="/api.php?op=count&id=673363&modelid=1"></script> <!--底部 end--> <script> (function(){ var el = document.createElement("script"); el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?b10b7ce524b7312f3e04066c263323dc34d74a39f743bb7932ac3b4dd512bbadfd9a9dcb5ced4d7780eb6f3bbd089073c2a6d54440560d63862bbf4ec01bba3a"; el.id = "ttzz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(el, s); })(window) </script></body> </html>