Создание устойчивых пауков против непоследовательной разметки HTML - PullRequest
0 голосов
/ 17 мая 2018

Я хочу получить контент игрока и судьи с этого сайта и сохранить его в БД. Сначала, когда я просматривал его, все игроки и судьи были в response.css («div.prelims p.indent :: text»), и я мог использовать регулярные выражения, чтобы анализировать игроков с игроками и судей. , Нет проблем.

Тогда я более внимательно посмотрел на остальную часть сайта, только чтобы убедиться, что они НЕ следуют этой структуре последовательно. Вот пример:

<div class="prelims">
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p1">
  <span class="num">1</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p2">
  <span class="num">2</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p3">
  <span class="num">3</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p4">
  <span class="num">4</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p5">
  <span class="num">5</span>
  <p class="indent">Text about referee.</p>
</div>
<div class="num" id="p6">

Мало того, что на этой странице есть эти 'num' и 'span', которых не было на другой странице, но и мое регулярное выражение, которое отлично работало на тестовой странице, разрывается на первом p class = indent здесь.

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

1 Ответ

0 голосов
/ 17 мая 2018

Я думаю, вы можете игнорировать теги div, если все теги p, которые вы хотите захватить, имеют класс отступа:

import re

text = r'''
<div class="prelims">
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p1">
  <span class="num">1</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p2">
  <span class="num">2</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p3">
  <span class="num">3</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p4">
  <span class="num">4</span>
  <p class="indent">Text about players.</p>
</div>
<div class="num" id="p5">
  <span class="num">5</span>
  <p class="indent">Text about referee.</p>
</div>
<div class="num" id="p6">
'''

pattern = re.compile(r"<p.*class=[\"\']indent[\"\'].*>(.+)<\/p>", re.MULTILINE)

for m in re.findall(pattern, text):
    print(m)

Выход:

Text about players.
Text about players.
Text about players.
Text about players.
Text about players.
Text about referee.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...