8
votes

Erreur de correspondance de regex

Je suis nouveau à Python (je n'ai aucune formation en programmation non plus), alors gardez cela à l'esprit alors que je pose ma question.

J'essaie de rechercher une page Web récupérée et de trouver tous les liens à l'aide d'un modèle spécifié. Je l'ai fait avec succès dans d'autres scripts, mais je reçois une erreur qui dit p>

import urllib2
from BeautifulSoup import BeautifulSoup
import re

url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html"
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)

pattern = r'<a href="http://forums.epicgames.com/archive/index.php?t-([0-9]+).html">(.?+)</a> <i>((.?+) replies)'
#pattern = r'href="http://forums.epicgames.com/archive/index.php?t-622233.html">Gears of War 2: Horde Gameplay</a> <i>(20 replies)'

for match in re.finditer(pattern, page, re.S):
    print match(0)


0 commentaires

5 Réponses :


1
votes

Vous devez échapper au littéral "?" et le littéral '(' et ')' que vous essayez de faire correspondre.

aussi, au lieu de «? + ', je pense que vous recherchez la correspondance non gourmande fournie par' +? '.

Plus de documentation ici.

pour votre cas, essayez ceci: xxx


4 commentaires

J'ai changé mon motif et j'ai retourné le script à nouveau, et pourtant aucun match n'a été trouvé, au moins je n'ai rien d'imprimé dans la fenêtre lorsque j'essaie de faire itération sur mes matchs et de les imprimer. Des idées?


Regardez le contenu du fichier à la main. Quand je le regarde, je ne vois pas la chaîne 'Réponses' dans elle n'importe où. Donc, la regex ne trouvera aucun match.


motif = r ' forums.epicgames.com/archive/index.php \? T - ([0-9] +). HTM L "> (. +?) ( \ (([0-9] +?) Réponses \))?" pourrait être plus proche?


J'ai essayé votre nouveau patère, et ce que je ne reçois pas, c'est que cela ne renvoyait aucun match. J'ai même raccourci le modèle et essayé ce code, et quand j'essaie d'imprimer match.group (0), rien (je pense) est envoyé à la console. Des idées? motif = r ' (. +?) ' pour le match Dans Re.Finditer (Modèle, page, RE.S): Match d'impression (0)



1
votes

Cela signifie que votre expression régulière a une erreur. XXX

Qu'est-ce que? + Moyenne? Les deux ? et + sont des caractères méta qui n'ont pas de sens juste à côté de l'autre. Peut-être que tu as oublié d'échapper à la "?" ou quelque chose.


1 commentaires

Ils ont un sens dans l'autre ordre. +? est une forme de correspondance non gourmande de +.



0
votes

Pour prolonger ce que les autres ont écrit:

.? signifie "un ou zéro de n'importe quel caractère"

. + signifie "un minerai plus de n'importe quel caractère"

Comme vous pouvez, espérons-le, la combinaison des deux n'a aucun sens; Ce sont des caractères "répéter" différents et contradictoires. Donc, votre erreur sur "répétitions multiples" est parce que vous avez combiné ces deux caractères "répéter" dans votre expression régulière. Pour le réparer, décidez simplement lequel vous vouliez réellement utiliser et supprimer l'autre.


1 commentaires

Sauf que. +? est une correspondance non gourmande d'un ou plusieurs caractères. Qui est ce qu'il est après.



1
votes

Comme vous la découvrez, l'analyse HTML arbitraire n'est pas facile à faire correctement. C'est ce que font des packages comme une belle soupe. Remarque, vous l'appelez dans votre script, mais n'utilisez pas les résultats. Reportez-vous à sa documentation ici pour des exemples de comment faire votre Tâche beaucoup plus facile!


1 commentaires

J'ai essayé la documentation. En tant que nouveau sur Python, et même HTML, j'ai eu du mal à trouver un temps difficile à trouver ce dont j'avais besoin. Bien que je n'ai aucun doute que cela puisse faire ce dont j'ai besoin.



0
votes
import urllib2
import re
from BeautifulSoup import BeautifulSoup

url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html"
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)

# Get all the links
links = [str(match) for match in soup('a')]

s = r'<a href="http://forums.epicgames.com/archive/index.php\?t-\d+.html">(.+?)</a>' 
r = re.compile(s)
for link in links:
    m = r.match(link)
    if m:
        print m.groups(1)[0]

4 commentaires

Est-il possible de filtrer les liens que je veux ... Comme vous pouvez le constater dans ma tentative de faire une regex, je veux un certain ensemble de liens. De plus, et je sais que je pousse ma chance, j'espérais avoir le texte de lien avec ça. En bref, est-il possible de filtrer les liens renvoyés et d'obtenir le texte de lien avec celui-ci?


Quelques choses: quel est le "texte de lien"? Les choses entre et ? Ou la valeur HREF? Ou des trucs après l'ouverture et la fermeture ? Ou quelque chose d'autre? ¶ Voici ce que je ne reçois pas: la page que vous indiquez, forums.epiicgames.com/archive/index.php?f-356-p-164.html , n'a même pas une seule instance de «réponses» dans la source HTML. Êtes-vous sûr vous cherchez cela? Et pourquoi avez-vous accepté comme réponse à une regex qui ne peut correspondre à aucun lien dans les données? ¶


Nouveau pour empiler débordement, ne réalisait pas cela signifiait que j'ai été fait, désolé. Par lien texte, je veux simplement le texte après le lien dans le code source (le texte juste avant . Puisque je suis nouveau à Python et à la gratte Web, je commence lentement et essaye d'apprendre autant que je peux. Mais tout ce que je cherche à faire est de saisir les liens de cette archive (chaque page), suivez chaque lien (discussion) et saisissez tous les messages de cette discussion. Je devrai analyser les données dans un «jeu de données», qui Peut être une liste, mais simplement, je veux gratter les archives et collecter tous les titres de messages et les messages pour chacun.


Marquer une solution comme «celui» signifie généralement que vous êtes satisfait de cela et que les intervenants ne s'attendront pas à obtenir de crédit pour des efforts supplémentaires. De plus, si vous sélectionnez l'une des solutions et que cela ne fonctionne pas réellement, que doivent-ils en faire des répondeurs? La nouvelle version du code va à la page Web que vous avez citée, racle tous les liens, puis imprime tout le texte entre les balises d'ouverture et d'ancrage de fermeture. Je pense que c'est ce que tu veux.