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