BeautifulSoup 是提取 HTML 中 div/class 结构化信息的首选工具,比 pandas.read_html() 更精准;应定位父容器、用 .get_text(strip=True) 提取文本、用 HTMLParser 处理嵌套标签;结构化数据需服务端注入、首屏输出;main 和 h1 是关键语义锚点。

直接用 BeautifulSoup 提取 div/class 结构最省事
多数 HTML 页面的结构化信息藏在 div、span 或带 class 的容器里,不是标准 table。这时候别硬套 pandas.read_html(),它会漏掉或错位——BeautifulSoup 才是开锁钥匙。
- 先定位父容器:
soup.find("div", class_="companyProfileHeader"),避免全局遍历拖慢速度 - 子项提取别用
.text粗暴拼接:嵌套<p class="bold">17000</p>时,.text会吞掉标签语义;改用.get_text(strip=True)或单独抓p.bold - 键值对识别靠文本模式:比如
"Industry"后紧跟冒号或换行,可用正则re.split(r'[:\n]\s*', line, maxsplit=1)切分,但得先过滤空行和纯链接
HTMLParser 比正则更稳,尤其对付嵌套脚本和乱序标签
正则遇到 <script>var a = "</script> 里的引号就容易提前闭合,HTMLParser 是标准库,天然按 HTML 规范做词法解析,不怕多层嵌套。
- 继承
HTMLParser类,重写handle_starttag()和handle_data(),把div开始/结束当成状态机开关 - 跳过
script和style内容:在handle_starttag()里设self.in_script = True,handle_endtag()里关掉,handle_data()只在not self.in_script时收集文本 - 不用手动计数闭合标签:解析器内部已维护栈,你只管响应事件
动态页面必须服务端注入,客户端 JS 注入等于没写
React/Vue 页面里用 useEffect 或 mounted 创建 script 标签塞 JSON-LD?Googlebot 不执行 JS,那块数据对爬虫完全透明。
- 结构化数据字段(如
headline、datePublished)必须随首屏 HTML 一起下发,不能依赖后续 API 请求填充 - SSR 框架(Next.js、Nuxt)要在
getServerSideProps或asyncData阶段把数据序列化进<script type="application/ld+json">,且确保@context、@type字段全小写、双引号包裹、无尾逗号 - 静态站点生成器(Hugo、Jekyll)用模板函数安全转义,比如 Hugo 的
{{ jsonify .Params }},别手拼字符串
main 和 h1 不是装饰,是结构化数据的锚点信号
没有 <main> 或里面没 <h1>,Article 类型的结构化数据可能被降权甚至忽略——爬虫靠这个判断“这页到底讲啥”。
-
<main>必须是顶层元素,不能包在<section>或<div>里;它内部至少一个可见<h1>,且文本要和headline字段严格一致 -
<h1>不能用 CSS 隐藏(display: none或visibility: hidden),爬虫不渲染,只读 DOM,隐藏就等于不存在 - 跳级标题(
<h1>→<h4>)会让爬虫误判段落归属,建议用<h2>分节,别为了样式省事跳级



















