web-dev-qa-db-fra.com

Pourquoi le fichier html converti à partir du premier fichier contenant un point d'interrogation ne peut pas s'afficher sur le navigateur quand cliquer sur le catalogue?

Veuillez télécharger le fichier simple.7z et installez dans votre sphinx pour reproduire les problèmes que j'ai décrits ici, afin de le reproduire, vous pouvez exécuter:

make clean
make html   

téléchargez et installez dans votre sphinx pour reproduire les problèmes

Il y a deux articles dans sample/source, le contenu est le même, seule la différence est le titre.

cd  sample
ls source |grep  "for-loop"
What does "_" in Python mean in a for-loop.rst
What does "_" in Python mean in a for-loop?.rst

L'un contient ? dedans, l'autre ne contient pas ?. Une chose étrange s'est produite après avoir exécuté make html.

make html
ls build/html|grep  "for-loop"
What does "_" in Python mean in a for-loop.html
What does "_" in Python mean in a for-loop?.html

please see the tile after running <code>make html</code> Problème 1:
Pourquoi Firefox apparaît-il alors comme What does “_” in Python mean in a for-loop? Remarque: "_" a été combiné en “_”;
Le titre qui ne contient pas de ? tel que What does "_" in Python mean in a for-loop.html a été compilé en What does “_” in Python mean in a for-loop?, qui ajoute un ? dedans?

Problème 2: pour cliquer sur le premier titre What does “_” in Python mean in a for-loop?, le navigateur passe à un état no url was not found on this server

no url was not found on this server when to click the first title Pour cliquer sur le deuxième titre What does “_” in Python mean in a for-loop?,ça fonctionne bien. works fine when to click the second title

Veuillez donner des explications sur mon problème.

14
scrapy

Le problème 1 n'est en fait pas un problème, c'est le comportement normal de Sphinx: le titre affiché n'est pas le nom de fichier mais le titre de niveau supérieur du document ResT , qui se termine par un point d'interrogation dans les deux cas. Voir la table des matières > .. toctree :: > Entrée section de cette page qui stipule:

Les titres des documents dans le toctree seront automatiquement lus à partir du titre du document référencé.

Si vous avez besoin d'être convaincu, changez simplement le titre de n'importe quel document, reconstruisez le HTML et voyez.


Le problème 2 est dû à la présence d'un point d'interrogation non codé en URL dans le href du lien. Dans une URL, le point d'interrogation signifie le début d'un chaîne de requête .

Cela tente d'accéder à What does "_" in Python mean in a for-loop?.html, signifie demander le What does "_" in Python mean in a for-loop Document HTML, lui donnant un .html paramètre. Et évidemment, le document demandé n'est pas trouvé car il n'existe pas.

Dans la barre d'adresse de votre navigateur, vous pouvez remplacer le point d'interrogation par sa forme encodée en url %3F, et observez que cela fonctionne alors.

Je n'ai trouvé aucun moyen de faire sphinx automatiquement les noms de document en urlencode dans le lien href ( c'est en fait considéré comme un bug ) ou dans tout document exprimant clairement la restriction de nommage pour les documents ResT.

Mais je sais par expérience que nommer un fichier avec ponctuation est souvent source de problèmes . Je vous conseillerais de renommer votre document avec des caractères moins exotiques (les slugifier). Nommer votre document ResT underscore_in_for_loop.rst au lieu de What does "_" in Python mean in a for-loop?.rst vous fera gagner beaucoup de temps et vous évitera des maux de tête.

Et rappelez-vous que cela ne devrait pas être un problème car, comme nous l'avons vu dans le premier numéro, le nom du document est utilisé uniquement pour l'URL.

6
Tryph

? est un caractère générique pour la partie Word correspondant à l'URL et sera donc traité comme un caractère spécial.

les jokers fonctionnent avec deux types de jokers:

  ? - any character  (one and only one)
  * - any characters (zero or more)

Pour cela, vous devez encoder l'URL

import urllib.parse
>>> urllib.parse.quote(<<url>>)

Dans Python 3.x, vous devez importer urllib.parse.quote:

import urllib.parse
urllib.parse.quote(<<url>>)
4
Sreeram Nair