Regex для ссылок в тексте HTML

Вы близко. Вам просто нужно переместить фильтрацию на второй таблице в условие on:

select d.date, a.entry, a.exit
from DATES d left join
     ATTENDANCE a
     on d.date = a.when and a.name = 'Bob' 
where MONTH(d.date) = MONTH('2019-01-01') and
      YEAR(d.date) = YEAR('2019-01-01')

Примечания:

  • Использовать псевдонимы таблиц. Рекомендуемые псевдонимы - это сокращения имени таблицы.
  • Уточните все имена столбцов, чтобы вы знали, из какой они таблицы.
  • Для извлечения месяца из константы не требуется подзапрос.
  • Вы должны указать год и месяц.

Лучший способ написать условие даты:

where d.date >= '2019-01-01' and
      d.date < '2019-01-01' + interval 1 month

Это лучше, потому что оптимизатор может использовать индекс на date, если он доступен.

7
задан Adam Matan 5 July 2011 в 19:22
поделиться

8 ответов

Как другие предположили, если подобная реальному времени производительность не необходима, BeautifulSoup является хорошим решением:

import urllib2
from BeautifulSoup import BeautifulSoup

html = urllib2.urlopen("http://www.google.com").read()
soup = BeautifulSoup(html)
all_links = soup.findAll("a")

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

Если Вы несомненно работаете над стандартным XHTML, можно использовать (намного) быстрее синтаксические анализаторы XML как эмигрант.

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

8
ответ дан 6 December 2019 в 05:06
поделиться

Это зависит немного от того, как HTML производится. Если это несколько управляло Вами, может сойти с рук:

re.findall(r'''<link\s+.*?href=['"](.*?)['"].*?(?:</link|/)>''', html, re.I)
1
ответ дан 6 December 2019 в 05:06
поделиться

Нет нет.

Можно рассмотреть использование Красивого Супа. Можно назвать это стандартом для парсинга файлов HTML.

5
ответ дан 6 December 2019 в 05:06
поделиться

Shoudln't ссылка быть четко определенным regex?

Нет, [X] HTML не находится в общем случае, parseable с regex. Рассмотрите примеры как:

<link title='hello">world' href="x">link</link>
<!-- <link href="x">not a link</link> -->
<![CDATA[ ><link href="x">not a link</link> ]]>
<script>document.write('<link href="x">not a link</link>')</script>

и это - всего несколько случайных допустимых примеров; если необходимо справиться с реальным супом тега HTML, там миллион уродливых возможностей.

Если Вы знаете и можете полагаться на точный выходной формат целевой страницы, можно сойти с рук regex. Иначе это - полностью неправильный выбор для очистки веб-страниц.

4
ответ дан 6 December 2019 в 05:06
поделиться

Regexes с HTML становятся грязными. Просто используйте синтаксический анализатор DOM как Красивый Суп.

17
ответ дан 6 December 2019 в 05:06
поделиться

Shoudln't ссылка быть четко определенным regex? Это - довольно теоретический вопрос,

Я ответ второго PEZ:

Я не думаю, что HTML предоставляет себя "четко определенным" регулярным выражениям, так как это не регулярный язык.

Насколько я знаю, любой HTML-тэг может содержать любое количество вложенных тегов. Например:

<a href="http://stackoverflow.com">stackoverflow</a>
<a href="http://stackoverflow.com"><i>stackoverflow</i></a>
<a href="http://stackoverflow.com"><b><i>stackoverflow</i></b></a>
...

Таким образом, в принципе, для соответствия тегу правильно необходимо смочь, по крайней мере, к строкам совпадения формы:

BE
BBEE
BBBEEE
...
BBBBBBBBBBEEEEEEEEEE
...

где B означает начало тега, и E означает конец. Таким образом, необходимо смочь к строкам совпадения, сформированным любым числом B, сопровождаемого тем же числом E. Чтобы сделать это, Ваш matcher должен смочь "рассчитать", и регулярные выражения (т.е. конечные автоматы) просто не могут сделать этого (для подсчета, автомату нужен, по крайней мере, стек). Что касается ответа PEZ, HTML является контекстно-свободной грамматикой, не регулярным языком.

3
ответ дан 6 December 2019 в 05:06
поделиться

Ответ на два дополнительных вопроса там.

  1. Я иногда разделял SGMLParser на подклассы (включенный в базовое распределение Python) и должен сказать, что это является прямым.
  2. Я не думаю, что HTML предоставляет себя "четко определенным" регулярным выражениям, так как это не регулярный язык.
1
ответ дан 6 December 2019 в 05:06
поделиться

В ответ на вопрос № 2 (не был должен ссылка быть четко определенным регулярным выражением) ответ... нет.

Структура ссылки HTML является рекурсивным во многом как parens и фигурные скобки на языках программирования. Должно быть равное количество запуска и конструкций конца, и выражение "ссылки" может быть вложено в себе.

Для надлежащего соответствия выражению "ссылки", regex потребовался бы, чтобы считать запуск и конечные тэги. Регулярные выражения являются классом Конечных автоматов. По определению Конечные автоматы не могут "считать" конструкции в шаблоне. Грамматика требуется, чтобы описывать рекурсивную структуру данных, такую как это. Неспособность для regex для "рассчитывания" состоит в том, почему Вы видите языки программирования, описанные с Грамматиками в противоположность регулярным выражениям.

Таким образом, не возможно создать regex, который будет положительно соответствовать 100% всех выражений "ссылки". Существует, конечно, regex's, который будет соответствовать большому количеству "ссылки" с высокой степенью точности, но они никогда не будут прекрасны.

Я написал статью блога об этой проблеме недавно. Ограничения Регулярного выражения

0
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: