如何用Python+BeautifulSoup在网页爬取中精准选取指定元素
解决BeautifulSoup精准选取HTML元素的问题
先说说你当前代码里的几个问题:
- 重复发起了两次HTTP请求,完全没必要,一次请求就能拿到响应文本和状态码
- 错误地对字符串调用
readlines()方法,thesis_infos.text是字符串类型,根本没有这个方法 - 通过文本行索引提取内容太依赖文本格式,只要HTML结构稍微调整,结果就会出错,应该直接定位目标标签
下面是修正后的代码,精准实现你要的需求:
import requests from bs4 import BeautifulSoup url = line.strip() # 只发起一次请求,同时获取响应内容和状态码 response = requests.get(url, headers=headers) r_html = response.text r_html_sc = response.status_code soup = BeautifulSoup(r_html, "html.parser") # 定位class为span16的div,class_是BeautifulSoup里专门处理class属性的写法(避免和Python关键字冲突) thesis_infos = soup.find('div', class_="span16") author = "" year = "" if thesis_infos is not None: # 获取div下所有h3标签,取第1个(索引0) h3_tags = thesis_infos.find_all('h3') if len(h3_tags) > 0: author = h3_tags[0].get_text(strip=True) # 获取div下所有h6标签,取第2个(索引1) h6_tags = thesis_infos.find_all('h6') if len(h6_tags) > 1: year = h6_tags[1].get_text(strip=True) # 输出结果 print(f"作者: {author}") print(f"时间: {year}")
关键用法说明:
find_all('标签名')会返回目标容器下所有对应标签的列表,通过索引就能精准定位第n个元素get_text(strip=True)可以提取标签内的文本,同时自动去除前后的空白字符,比直接用.text.strip()更灵活- 增加了列表长度判断,避免因为标签数量不足导致的索引越界报错
内容的提问来源于stack exchange,提问作者M. Zain Aldin
相关产品推荐
相关产品推荐

