BeautifulSoup仅提取最后一个HTML页面的h1标签,如何修正?
问题解决:提取Brainly多个页面H1文本失败
嘿,我瞅了你的代码,问题主要有两个点,咱们一步步来捋:
变量重复赋值(虽不直接引发问题,但易混淆):你一开始用
r存储GraphQL的响应结果,后面遍历页面URL时又把r重新赋值为页面的HTML文本——Python允许这么做,但会降低代码可读性,建议换个更清晰的变量名。核心问题:请求头缺失导致页面内容未正确获取:Brainly会检测请求的
User-Agent字段,直接用requests.get()发送请求可能被网站反爬机制拦截,返回的页面结构和你预期的不一样,自然找不到目标H1标签。另外,你的提取逻辑也可以稍微优化下,提升效率。
修正后的代码
from bs4 import BeautifulSoup import requests # 定义请求头,模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } data = [{"operationName": "SearchQuery", "variables": {"query": "Python", "after": None, "first": 2}, "query": "query SearchQuery($query: String!, $first: Int!, $after: ID) {\n questionSearch(query: $query, first: $first, after: $after) {\n count\n edges {\n node {\n id\n databaseId\n author {\n id\n databaseId\n isDeleted\n nick\n avatar {\n thumbnailUrl\n __typename\n }\n rank {\n name\n __typename\n }\n __typename\n }\n content\n answers {\n nodes {\n thanksCount\n ratesCount\n rating\n __typename\n }\n hasVerified\n __typename\n }\n __typename\n }\n highlight {\n contentFragments\n __typename\n }\n __typename\n }\n __typename\n }\n}\n"}] # 获取问题页面URL列表 graphql_response = requests.post("https://brainly.com.br/graphql/pt", json=data, headers=headers).json() question_urls = [] for item in graphql_response[0]['data']['questionSearch']['edges']: question_url = f"https://brainly.com.br/tarefa/{item['node']['databaseId']}" question_urls.append(question_url) # 遍历每个URL提取H1文本 for index, url in enumerate(question_urls, start=1): page_response = requests.get(url, headers=headers) page_response.encoding = 'utf-8' # 确保编码正确,避免乱码 soup = BeautifulSoup(page_response.text, 'html.parser') # 直接定位目标H1标签(每个页面仅一个) target_h1 = soup.select_one('div.brn-content-image h1') if target_h1: # 处理换行符,把<br>替换为空格,清理多余空白 clean_text = ' '.join(target_h1.stripped_strings) print(f"{index} h1 - {clean_text}") else: print(f"{index} h1 - 未找到目标H1标签")
关键修正说明
- 添加请求头:模拟浏览器发送请求,绕过Brainly的基础反爬检测,确保能获取完整的页面内容。
- 优化变量命名:将
r拆分为graphql_response和page_response,代码逻辑更清晰,避免变量覆盖带来的混淆。 - 改进提取逻辑:使用
select_one()直接定位目标H1标签,比嵌套find_all()更高效;同时用stripped_strings处理H1内的换行和多余空格,输出格式更整洁。 - 设置编码:指定
utf-8编码,避免特殊字符或非英文内容出现乱码。
内容的提问来源于stack exchange,提问作者Soares
相关产品推荐
相关产品推荐

