Игра соскабливает регулярное выражение python

70
5

Я пытаюсь очистить некоторые файлы игры от шахматного сайта в Python, и у меня возникла проблема. Мой план состоит в том, чтобы снять все игровые идентификаторы из html и подключить их к некоторому URL-адресу, чтобы загрузить их. Жесткая часть на самом деле получает идентификаторы игры.

Соответствующий html выглядит примерно так:

<a class="games right-4" href="/livechess/game?id=1012106017"> View</a>
<a class="games right-4" href="/livechess/game?id=982464559"> View</a>
<a class="games right-4" href="/livechess/game?id=1011988271"> View</a>

Меня интересует id=... part. Кроме того, нет других событий, начинающихся с /livechess/... на странице.

Как извлечь эти идентификаторы с помощью регулярных выражений? Я пробовал читать кое-что, но это меня путало больше, чем помогало.

спросил(а) 2014-12-28T15:19:00+03:00 5 лет, 10 месяцев назад
1
Решение
71

Не используйте регулярное выражение для анализа HTML. Вместо этого используйте парсер HTML. С BeautifulSoup эта задача так же проста, как:

for link in soup.select('a[href^=/livechess/game?id=]'):
print link['href']

получение только идентификатора из этого может быть выполнено с разбиением строк:

link_id = link['href'].partition('id=')[-1]

Демо с живой страницей:

>>> import requests
>>> from bs4 import BeautifulSoup
>>> r = requests.get('http://www.chess.com/members/view/MagnusCarlsen')
>>> soup = BeautifulSoup(r.content)
>>> for link in soup.select('a[href^=/livechess/game?id=]'):
... print link['href']
...
/livechess/game?id=998801933
/livechess/game?id=998801191
/livechess/game?id=998801076
/livechess/game?id=998801451
/livechess/game?id=998801336
/livechess/game?id=998801799
/livechess/game?id=998801568
/livechess/game?id=998800852
/livechess/game?id=998802049
/livechess/game?id=998800982

ответил(а) 2014-12-28T15:21:00+03:00 5 лет, 10 месяцев назад
41

Комбинация регулярных выражений и BeautifulSoup.


In [14]: for i in soup.find_all('a', href=re.compile("^/livechess/game\?id=")):
...: print(re.split(r'id=', i['href'])[1])
...:
998801933
998801191
998801076
998801451
998801336
998801799
998801568
998800852
998802049
998800982

ответил(а) 2014-12-28T15:56:00+03:00 5 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема