Comment puis-je effectuer une recherche dans les questions Stack Overflow à partir d'un script?

StackOverflow https://stackoverflow.com/questions/196755

Question

Étant donné une chaîne de mots-clés, tels que "Meilleures pratiques Python", j'aimerais obtenir les 10 premières questions Stack Overflow contenant ces mots-clés, triées par pertinence (?), par exemple à partir d'un script Python. Mon but est de finir avec une liste de tuples (titre, URL).

Comment puis-je accomplir cela? Souhaitez-vous envisager d'interroger Google à la place? (Comment le feriez-vous à partir de Python?)

Était-ce utile?

La solution

>>> from urllib import urlencode
>>> params = urlencode({'q': 'python best practices', 'sort': 'relevance'})
>>> params
'q=python+best+practices&sort=relevance'
>>> from urllib2 import urlopen
>>> html = urlopen("http://stackoverflow.com/search?%s" % params).read()
>>> import re
>>> links = re.findall(r'<h3><a href="([^"]*)" class="answer-title">([^<]*)</a></h3>', html)
>>> links
[('/questions/5119/what-are-the-best-rss-feeds-for-programmersdevelopers#5150', 'What are the best RSS feeds for programmers/developers?'), ('/questions/3088/best-ways-to-teach-a-beginner-to-program#13185', 'Best ways to teach a beginner to program?'), ('/questions/13678/textual-versus-graphical-programming-languages#13886', 'Textual versus Graphical Programming Languages'), ('/questions/58968/what-defines-pythonian-or-pythonic#59877', 'What defines &#8220;pythonian&#8221; or &#8220;pythonic&#8221;?'), ('/questions/592/cxoracle-how-do-i-access-oracle-from-python#62392', 'cx_Oracle - How do I access Oracle from Python? '), ('/questions/7170/recommendation-for-straight-forward-python-frameworks#83608', 'Recommendation for straight-forward python frameworks'), ('/questions/100732/why-is-if-not-someobj-better-than-if-someobj-none-in-python#100903', 'Why is if not someobj: better than if someobj == None: in Python?'), ('/questions/132734/presentations-on-switching-from-perl-to-python#134006', 'Presentations on switching from Perl to Python'), ('/questions/136977/after-c-python-or-java#138442', 'After C++ - Python or Java?')]
>>> from urlparse import urljoin
>>> links = [(urljoin('http://stackoverflow.com/', url), title) for url,title in links]
>>> links
[('http://stackoverflow.com/questions/5119/what-are-the-best-rss-feeds-for-programmersdevelopers#5150', 'What are the best RSS feeds for programmers/developers?'), ('http://stackoverflow.com/questions/3088/best-ways-to-teach-a-beginner-to-program#13185', 'Best ways to teach a beginner to program?'), ('http://stackoverflow.com/questions/13678/textual-versus-graphical-programming-languages#13886', 'Textual versus Graphical Programming Languages'), ('http://stackoverflow.com/questions/58968/what-defines-pythonian-or-pythonic#59877', 'What defines &#8220;pythonian&#8221; or &#8220;pythonic&#8221;?'), ('http://stackoverflow.com/questions/592/cxoracle-how-do-i-access-oracle-from-python#62392', 'cx_Oracle - How do I access Oracle from Python? '), ('http://stackoverflow.com/questions/7170/recommendation-for-straight-forward-python-frameworks#83608', 'Recommendation for straight-forward python frameworks'), ('http://stackoverflow.com/questions/100732/why-is-if-not-someobj-better-than-if-someobj-none-in-python#100903', 'Why is if not someobj: better than if someobj == None: in Python?'), ('http://stackoverflow.com/questions/132734/presentations-on-switching-from-perl-to-python#134006', 'Presentations on switching from Perl to Python'), ('http://stackoverflow.com/questions/136977/after-c-python-or-java#138442', 'After C++ - Python or Java?')]

La conversion de cette fonction en une fonction devrait être triviale.

MODIFIER : Zut, je vais le faire ...

def get_stackoverflow(query):
    import urllib, urllib2, re, urlparse
    params = urllib.urlencode({'q': query, 'sort': 'relevance'})
    html = urllib2.urlopen("http://stackoverflow.com/search?%s" % params).read()
    links = re.findall(r'<h3><a href="([^"]*)" class="answer-title">([^<]*)</a></h3>', html)
    links = [(urlparse.urljoin('http://stackoverflow.com/', url), title) for url,title in links]

    return links

Autres conseils

Puisque Stackoverflow possède déjà cette fonctionnalité, il vous suffit d’obtenir le contenu de la page de résultats de recherche et de récupérer les informations dont vous avez besoin. Voici l'URL pour une recherche par pertinence:

  

https://stackoverflow.com/search?q=python+best+practices&ort=relocation

Si vous affichez Source, vous verrez que les informations dont vous avez besoin pour chaque question se trouvent sur une ligne comme celle-ci:

<h3><a href="/questions/5119/what-are-the-best-rss-feeds-for-programmersdevelopers#5150" class="answer-title">What are the best RSS feeds for programmers/developers?</a></h3>

Vous devriez donc pouvoir obtenir les dix premiers en effectuant une recherche régulière sur une chaîne de cette forme.

Suggérez qu'une API REST soit ajoutée à SO. http://stackoverflow.uservoice.com/

Vous pouvez filtrer le code HTML renvoyé dans une requête HTTP valide. Mais cela entraînerait un mauvais karma et la perte de la possibilité de passer une bonne nuit de sommeil.

Je voudrais simplement utiliser Pycurl pour concaténer les termes de recherche dans la requête uri.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top