2014-12-30 3 views
1

Я вроде как новый для регулярных выражений, но тот, который я сделал сам, не работает. Он должен давать мне данные с веб-сайтов html.Регулярное выражение - HTML

Я в основном хочу получить это из html и всех из нескольких. У меня есть URL-адрес страницы в виде строки.

<a href="http://store.steampowered.com/search/?category2=2" class="name">Co-Op</a> 

А что я сделал для моего регулярного выражения:

<a\bhref="http://store.steampowered.com/search/?category2=2"\bclass="name"*>(.*?)</a>\g 
+3

Использование регулярного выражения для разбора HTML, как правило, является плохой идеей. Вам будет намного лучше использовать библиотеку синтаксического анализа HTML или инструмент – Jason

ответ

3

Вы никогда не должны анализировать HTML/XML или любой другой язык, который позволяет каскадные с использованием регулярных выражений.

Хорошая вещь с HTML однако, является то, что он может быть преобразован в XML и XML имеет хороший набор инструментов для разбора:

echo '<a href="http://store.steampowered.com/search/?category2=2" class="name">Co-Op</a>' | tidy -asxhtml -numeric 2> /dev/null | xmllint --html --xpath 'normalize-space(//a[@class="name" and @href="http://store.steampowered.com/search/?category2=2"])' - 2>/dev/null 

С запросом:

normalize-space(//a[@class="name" and @href="http://store.steampowered.com/search/?category2=2"]) 

// означает любой тег (независимо от его глубина), a означает тег a, и мы также указываем ограничения, которые class=name и href=(the link). И затем мы вернули содержимое normalize-space между таким тегом <a> и </a>.

В Python вы можете использовать:

import urllib2 
from bs4 import BeautifulSoup 

page = urllib2.urlopen("http://store.steampowered.com/app/24860/").read() 
soup = BeautifulSoup(page) 
print soup.find_all('a',attrs={'class':'name','href':'http://store.steampowered.com/search/?category2=2'}) 

комментарий на своем регулярном выражении:

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

<a\s+href="http://store\.steampowered\.com/search/\?category2=2"\s+class="name"\S*>(.*?)</a>\g 

я также заменил \b с \s, \s означает космические символы, такие как пробел, табуляция, новая линия. Хотя регулярное выражение довольно хрупкое: если кто-либо решает обменять href и class, у программы есть проблема. Для большинства этих проблем действительно есть решения, но лучше использовать инструмент анализа XML.

+0

На каком языке это? Я кодирую в python прямо сейчас ... – JonasRH

+0

Первая проблема в регулярном выражении кажется мне, что 'a \ bhref' никогда не соответствует чему-либо, и, конечно же, не' a href'. Он запрашивает границу слова между буквами 'ah', которая не может существовать без дополнительных символов. Собственно, поцарапать это, это вторая проблема. Я согласен с первой проблемой: регулярное выражение для синтаксического анализа - плохая идея. –

+0

@JonasRH: Это простое linux 'bash', но есть и XML-анализаторы для Python. –

Смежные вопросы