Как извлечь URL-адрес из этого тега HTML?

Я пытаюсь получить все URL-адреса с id='revSAR' из тега HTML ниже, используя регулярное выражение Python:

<a id='revSAR' href='http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending' class='txtsmall noTextDecoration'>
  See all 136 customer reviews
</a>

Я попробовал код ниже, но он не работает (ничего не печатает):

regex = b'<a id="revSAR" href="(.+?)" class="txtsmall noTextDecoration">(.+?)</a>'
pattern=re.compile(regex)
rev_url=re.findall(pattern,txt)
print ('reviews url: ' + str(rev_url))

person Vijay Kumar    schedule 20.08.2013    source источник
comment
Пример анализа a ссылок с помощью Beautiful Soup: groups.google.com/forum /?fromgroups#!topic/beautifulsoup/   -  person Paul    schedule 20.08.2013
comment
Или stackoverflow.com/questions/1080411/   -  person Paul    schedule 20.08.2013


Ответы (4)


Вы можете попробовать что-то вроде

(_, url), = re.findall(r'href=([\'"]*)(\S+)\1', input)
print url

Однако лично я бы предпочел использовать для подобной задачи библиотеку анализа HTML, например BeautifulSoup.

person Marc Liyanage    schedule 20.08.2013
comment
Будет ли BeautiflSoup работать с Windows? Как мне установить и настроить под python 33 и заставить его работать? - person Vijay Kumar; 20.08.2013
comment
Я не работаю в Windows, поэтому никогда этого не делал, но в этом посте, похоже, есть советы по установке BeautifulSoup в Windows: Как установить Beautiful Soup 4 с Python 2.7 на Windows - person Marc Liyanage; 20.08.2013

Вам не нужно сопоставлять такие ненужные части, как id=..., href=.... Попробуйте следующее:

regex = 'http://.*\'\s+'

person WoooHaaaa    schedule 20.08.2013
comment
Поскольку на странице отзывов о продуктах Amazon есть несколько URL-адресов, я хотел бы извлечь только URL-адрес для тега, начинающегося с этого идентификатора ‹a id='revSAR' - person Vijay Kumar; 20.08.2013

Во-первых, почему ваше регулярное выражение не сработало? В вашем html атрибуты указаны с использованием одинарных кавычек, где, как и в регулярном выражении, его двойные кавычки. И вам нужно заботиться только об атрибуте href. Попробуйте что-нибудь вроде href=['"](.+?)['"] в качестве регулярного выражения, и было бы лучше, если бы вы использовали переключатель игнорирования регистра.

Но опять же, это очень плохое решение для анализа html с использованием регулярных выражений. Пожалуйста, просмотрите это

person Jithin    schedule 20.08.2013

Описание

Это выражение будет:

  • найти якорные теги
  • требовать, чтобы тег привязки имел атрибут id со значением revSAR
  • захватит значение атрибута href, не включая окружающие кавычки, если они существуют
  • захватит внутренний текст и обрежет пробелы
  • позволит атрибутам появляться в любом порядке
  • разрешить атрибутам иметь двойные кавычки, одинарные кавычки или не кавычки
  • избегайте многих пограничных случаев, которые часто приводят к срабатыванию регулярных выражений при сопоставлении с шаблоном html

<a(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sid=(['"]?)revSAR\1(?:\s|>)) (?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\shref=(['"]?)(.*?)\2(?:\s|>))(?:[^>=]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>\s*(.*?)\s*<\/a>

введите здесь описание изображения

Примеры

Живое демо

Образец текста

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

<a onmouseover=' id="revSAR" ; href="http://www.NotYourURL.com" ; if (3 <href&& href="http://www.NotYourURL.com" && 6>3) { funRotate(href) ; } ; '  href='http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending' class='txtsmall noTextDecoration'>
  You shouldn't find me
</a>



<a onmouseover=' img = 10; href="http://www.NotYourURL.com" ; if (3 <href&& href="http://www.NotYourURL.com" && 6>3) { funRotate(href) ; } ; ' id='revSAR' href='http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending' class='txtsmall noTextDecoration'>
  See all 111 customer reviews
</a>


<a id='revSAR' href='http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending' class='txtsmall noTextDecoration'>
  See all 136 customer reviews
</a>

Совпадения

Группа 0 получает весь тег привязки
Группа 1 получает кавычку вокруг атрибута id, которая используется позже для поиска правильной закрывающей кавычки
Группа 2 получает кавычку вокруг атрибута href, которая позже используется для поиска правильного закрытия quote
Группа 3 получает значение атрибута href, не включая кавычки. Группа 4 получает внутренний текст, не включая окружающие пробелы.

[0][0] = <a onmouseover=' img = 10; href="http://www.NotYourURL.com" ; if (3 <href&& href="http://www.NotYourURL.com" && 6>3) { funRotate(href) ; } ; ' id='revSAR' href='http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending' class='txtsmall noTextDecoration'>
  See all 111 customer reviews
</a>
[0][1] = '
[0][2] = '
[0][3] = http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending
[0][4] = See all 111 customer reviews


[1][0] = <a id='revSAR' href='http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending' class='txtsmall noTextDecoration'>
  See all 136 customer reviews
</a>
[1][1] = '
[1][2] = '
[1][3] = http://www.amazon.com/Altec-Lansing-inMotion-Mobile-Speaker/product-reviews/B000EDKP8U/ref=cm_cr_dp_see_all_summary?ie=UTF8&showViewpoints=1&sortBy=byRankDescending
[1][4] = See all 136 customer reviews
person Ro Yo Mi    schedule 20.08.2013