Синтаксическая ошибка - Python re.search (класс символов, каретка) - PullRequest
0 голосов
/ 24 марта 2012

Соскребание страниц с помощью BeautifulSoup; пытается отфильтровать ссылки, заканчивающиеся на "... html # comments"

Код следует:

import urllib.request
import re
from bs4 import BeautifulSoup

base_url = "http://voices.washingtonpost.com/thefix/morning-fix/"
soup = BeautifulSoup(urllib.request.urlopen(base_url)).findAll('a')
links_to_follow = []
for i in soup:
        if i.has_key('href') and \
    re.search(base_url, i['href']) and \
    len(i['href']) > len(base_url) and \
    re.search(r'[^(comments)]', i['href']):
        print(i['href'])

Python 3.2, Windows 7 64-bit.

Приведенный выше скрипт сохраняет ссылку, заканчивающуюся на "#comments"

Я пытался re.search([^comments], i['href']), re.search([^(comments)], i['href']) и re.search([^'comments'], i['href']) - все синтаксические ошибки скинули.

Впервые в Python, поэтому извиняюсь за банальность.

Полагаю, либо (а) я недостаточно разбираюсь в префиксе 'r', чтобы правильно его использовать или (b) в ответ на [^ (foo)] re.search возвращает не набор строк, исключающих «foo», а набор строк, состоящий из более чем «foo». например, я сохраняю свою ссылку ... # комментариев, потому что ... texttexttext.html # комментариев предшествует ей или (c) Python интерпретирует "#" как комментарий, заканчивающийся строкой, которой должен соответствовать re.search.

Я думаю, что я не прав (b).

Извините, знайте, это просто. Спасибо,

Zack

Ответы [ 2 ]

2 голосов
/ 24 марта 2012
[^(comments)]

означает «один символ, который не является ни (, ни c, o, m, e, n, t, s или ) ".Вероятно, не то, что вы намеревались.

Если ваша цель состоит в том, чтобы иметь регулярное выражение, которое соответствует, только если указанная строка не заканчивается на #comments, тогда я бы использовал

... and not re.search("#comments$", i['href'])

или дажелучше (зачем вообще использовать регулярное выражение, если это так просто?):

... and not i['href'].endswith("#comments")

Что касается других ваших вопросов:

Запись r'...' позволяет писать «необработанные строки»,это означает, что обратные косые черты не должны быть экранированы:

  • r'\b' означает «обратный слеш + b» (который будет интерпретирован механизмом регулярных выражений как «граница слова»
  • '\b' означает «символ возврата»
  • и т. Д.

# не имеет специального значения в регулярном выражении, если вы не используете опцию (?x) или re.VERBOSE. В этом случае, он действительно начинает комментарий в многострочном регулярном выражении.

0 голосов
/ 24 марта 2012

Regex может быть не лучшим решением здесь:

import urllib.request
from bs4 import BeautifulSoup

base_url = "http://voices.washingtonpost.com/thefix/morning-fix/"
soup = BeautifulSoup(urllib.request.urlopen(base_url)).findAll('a')
links_to_follow = []
for i in soup:
    href = i.get('href')
    if href is None:
        continue
    if not href.startswith(base_url):
        continue
    if href.endswith('#comments'):
        print href
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...