Проблемы с сопоставлением регулярных выражений - PullRequest
1 голос
/ 17 марта 2011

В настоящее время я изучаю Python и пытаюсь сделать небольшой скребок, но у меня возникают проблемы с Beautiful Soup и regex.

Я пытаюсь сопоставить все ссылки на сайте, который имеет следующий HTML:

<td>
    <a href="/l1234/Place+Number+1">Place Number 1 </a>
</td>
<td width="100">
    California  </td>
<td>
    <a href="/l2342/Place+Number+2">Place Number 2 </a>
</td>
<td width="100">
    Florida </td>

Я хочу получить все следующие ссылки: "/ lxxxx / Place + Number + x"

Я использую Python и Beautifulsoup для этого:

import BeautifulSoup
import urllib2
import re

address = 'http://www.example.com'

html = urllib2.urlopen(address).read()

soup = BeautifulSoup(html)

for tag in soup.findAll('a', id = re.compile('l[0-9]*')):
    print tag['href']

Часть регулярного выражения в sou.find. Все, что я нашел в некотором примере кода, потому что я не могу заставить работать пример из документации BeautifulSoup. Без части регулярного выражения я получил все ссылки на странице, но я хочу только "lxxx"

Что я делаю не так с моим регулярным выражением? Может быть, есть способ сделать это без регулярных выражений, но я не могу найти способ.

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

Разве вы не должны пытаться сделать регулярное выражение на href, а не id?

for tag in soup.findAll('a', href = re.compile('l[0-9]*')):
    print tag['href']
2 голосов
/ 17 марта 2011

Я бы предложил

for tag in soup.findAll('a', href = re.compile('^/l[0-9]+/.*$')):
    print tag['href']

, чтобы избежать появления тегов, которые выглядят, но не совсем как вы

1 голос
/ 17 марта 2011

Помимо чека href, а не id

re.compile(r'^\/l[0-9]{4}/Place\+Number\+[0-9]+')

совпадение предполагает, что ваше регулярное выражение начинается с "^".

>>> m = re.compile(r"abc")
>>> m.match("eabc")
>>> m.match("abcd")
<_sre.SRE_Match object at 0x7f23192318b8>

Таким образом, добавление \ / позволяет сопоставить первый слеш. Также я использую {4} для соответствия четырем числам, а не *, что будет соответствовать нулю или большему числу.

>>> m = re.compile(r'\/l[0-9]*')
>>> m.match("/longurl/somewhere")
<_sre.SRE_Match object at 0x7f2319231850>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...