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

网页抓取调试:如何为标题、摘要、日期选择正确标签?

排查爬虫空列表问题的思路与修正方案

嘿,我来帮你搞定这个爬虫空列表的问题~ 空列表基本可以确定是CSS选择器匹配不到元素导致的,我来逐个拆解你代码里的选择器问题:

核心问题分析

  • 多class选择器写法错误:你写的p.summary story-summary hidden-xs是错误的!多个class的CSS选择器需要用.连接,空格是后代选择器,正确写法应该是p.summary.story-summary.hidden-xs,之前的写法会找p.summary下的story-summary标签(显然不存在),所以肯定拿不到摘要内容。
  • 依赖索引取元素风险高:x.findAll("a")[1].text靠索引取第二个a标签,一旦页面结构微调就会失效,不如用精准的class选择器定位标题。
  • 外层容器选择器可能不匹配:需要确认页面上是否真的存在div.story-content-pull这个元素,可能class名有拼写错误或者是多个class组合(比如story-content pull,那选择器应该是div.story-content.pull)。

修正后的代码示例

def main(req, num):
    r = req.get(website+"/pag/{}/".format(num))
    soup = BeautifulSoup(r.content, 'html.parser')
    try:
        # 先确认外层故事容器是否存在
        story_containers = soup.select("div.story-content-pull")
        if not story_containers:
            print(f"未找到故事容器,页面URL: {r.url}")
            return []
        
        data = []
        for container in story_containers:
            # 提取日期,增加容错处理
            date_elem = container.select_one("span.timestamp")
            date = date_elem.text.strip() if date_elem else "无日期"
            
            # 优先用精准class选标题, fallback到原索引方式
            title_elem = container.select_one("a.story-title") or container.find_all("a")[1]
            title = title_elem.text.strip() if title_elem else "无标题"
            
            # 修正多class选择器写法
            summary_elem = container.select_one("p.summary.story-summary.hidden-xs")
            content = summary_elem.get_text(strip=True) if summary_elem else "无摘要"
            
            data.append((date, title, content))
        return data
    except Exception as e:
        print(f"页面{num}出错,URL: {r.url},错误信息: {str(e)}")
        return []

# 后续线程池和DataFrame代码保持不变
with ThreadPoolExecutor(max_workers=10) as executor:
    with requests.Session() as req:
        fs = [executor.submit(main, req, num) for num in range(1, 10)]
        allin = []
        for f in fs:
            f = f.result()
            if f:
                allin.extend(f)
df = pd.DataFrame.from_records(allin, columns=["Date", "Title", "Content"])

调试建议

  • 用print(soup.prettify())打印页面源码,或者在浏览器F12开发者工具里检查元素,确认每个字段的真实标签和class。
  • 单独测试每个选择器,比如先运行soup.select("div.story-content-pull")看是否返回元素,再逐步测试子元素的选择器是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:32:27