如何从脚本中搜索 Stack Overflow 问题

170 阅读2分钟

给定一个关键词字符串,例如“Python 最佳实践”,我想从 Python 脚本中获取包含该关键词的 Stack Overflow 问题的前 10 个问题,按相关性排序。我的目标是以列表(标题、URL)结束。如何实现这个目标?你是否考虑过查询 Google?你将如何用 Python 实现它?

2、解决方案

1、使用 Stack Overflow 搜索 API

Stack Overflow 提供了一个搜索 API,可以用于从脚本中搜索问题。该 API 允许您指定查询字符串、排序顺序和其他选项。以下是使用 Stack Overflow 搜索 API 从脚本中获取问题的示例:

import requests

def get_stackoverflow_questions(query):
    """
    使用 Stack Overflow 搜索 API 获取问题

    Args:
        query (str): 查询字符串

    Returns:
        list: 问题的列表
    """

    # 设置请求参数
    params = {
        'q': query,
        'sort': 'relevance',
        'order': 'desc'
    }

    # 发送请求
    response = requests.get('https://api.stackexchange.com/2.3/questions', params=params)

    # 解析响应
    data = response.json()
    questions = data['items']

    # 返回问题列表
    return questions


# 获取包含“Python 最佳实践”关键词的前 10 个问题
questions = get_stackoverflow_questions('Python 最佳实践')

# 打印问题列表
for question in questions:
    print(question['title'])
    print(question['link'])

2、使用 BeautifulSoup 库

BeautifulSoup 是一个用于从 HTML 和 XML 文档中提取数据的 Python 库。它可以轻松地解析 HTML 文档并提取所需的信息。以下是使用 BeautifulSoup 库从 Stack Overflow 搜索结果页面中提取问题的示例:

import requests
from bs4 import BeautifulSoup

def get_stackoverflow_questions(query):
    """
    使用 BeautifulSoup 库从 Stack Overflow 搜索结果页面中提取问题

    Args:
        query (str): 查询字符串

    Returns:
        list: 问题的列表
    """

    # 设置请求参数
    params = {
        'q': query,
        'sort': 'relevance',
        'order': 'desc'
    }

    # 发送请求
    response = requests.get('https://stackoverflow.com/search', params=params)

    # 解析响应
    soup = BeautifulSoup(response.text, 'html.parser')

    # 找到问题列表
    questions = soup.find_all('div', class_='question-summary')

    # 提取问题列表中的信息
    question_list = []
    for question in questions:
        title = question.find('a', class_='question-hyperlink').text
        link = question.find('a', class_='question-hyperlink')['href']
        question_list.append((title, link))

    # 返回问题列表
    return question_list


# 获取包含“Python 最佳实践”关键词的前 10 个问题
questions = get_stackoverflow_questions('Python 最佳实践')

# 打印问题列表
for question in questions:
    print(question[0])
    print(question[1])

3、使用正则表达式

正则表达式是一种用于匹配文本模式的强大工具。它可以用于从文本中提取所需的信息。以下是使用正则表达式从 Stack Overflow 搜索结果页面中提取问题的示例:

import requests
import re

def get_stackoverflow_questions(query):
    """
    使用正则表达式从 Stack Overflow 搜索结果页面中提取问题

    Args:
        query (str): 查询字符串

    Returns:
        list: 问题的列表
    """

    # 设置请求参数
    params = {
        'q': query,
        'sort': 'relevance',
        'order': 'desc'
    }

    # 发送请求
    response = requests.get('https://stackoverflow.com/search', params=params)

    # 解析响应
    html = response.text

    # 匹配问题列表
    pattern = r'<div class="question-summary">.*?<a class="question-hyperlink" href="(.+?)">(.+?)</a>'
    questions = re.findall(pattern, html)

    # 返回问题列表
    return questions


# 获取包含“Python 最佳实践”关键词的前 10 个问题
questions = get_stackoverflow_questions('Python 最佳实践')

# 打印问题列表
for question in questions:
    print(question[1])
    print(question[0])