使用Python BS4爬取CVPR2021页面:提取表单ID值求助
解决方法
首先修正你的标题选择器写法,soup.select('dt', {'class' : 'ptitle'})不符合CSS选择器规范,应该用dt.ptitle来选择class为ptitle的dt标签。接下来,每个标题对应的dd标签是dt的下一个兄弟节点,我们可以通过find_next_sibling方法获取,再从中提取form的id值。
完整代码如下:
import requests, bs4 url = "https://openaccess.thecvf.com/CVPR2021?day=all" webpage = requests.get(url) soup = bs4.BeautifulSoup(webpage.content, 'html.parser') # 正确选择所有class为ptitle的dt标签 title_dts = soup.select('dt.ptitle') title_form_dict = {} for title_dt in title_dts: # 获取当前dt对应的下一个dd兄弟标签 dd_tag = title_dt.find_next_sibling('dd') if not dd_tag: continue # 如果没有对应的dd,跳过 # 在dd标签里找到form元素 form_tag = dd_tag.find('form') if not form_tag or 'id' not in form_tag.attrs: continue # 如果没有form或者form没有id,跳过 # 提取标题文本(去除多余空格) title_text = title_dt.get_text(strip=True) # 提取form的id值 form_id = form_tag['id'] title_form_dict[title_text] = form_id # 验证结果,比如打印前5个键值对 for idx, (title, form_id) in enumerate(title_form_dict.items()): if idx < 5: print(f"标题: {title}\nForm ID: {form_id}\n") print(f"共提取到{len(title_form_dict)}条有效数据")
关键说明
- 使用
find_next_sibling('dd')精准定位当前标题对应的dd标签,避免选中其他无关的dd元素 - 增加了空值判断,防止因为页面结构异常(比如某个标题没有对应的dd或form)导致程序报错
- 用
get_text(strip=True)处理标题文本,去除前后空格和换行符,让字典的键更整洁
内容的提问来源于stack exchange,提问作者Keith H
相关产品推荐
相关产品推荐

