网页抓取调试:如何为标题、摘要、日期选择正确标签?
排查爬虫空列表问题的思路与修正方案
嘿,我来帮你搞定这个爬虫空列表的问题~ 空列表基本可以确定是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
相关产品推荐
相关产品推荐

