я пошел, хотя это сообщение, почему бы не использовать регулярное выражение для HTML. Как часть заданной мне задачи, у меня не было выбора, кроме как использовать регулярное выражение для HTML.
У меня есть HTML-код и по отдельности
<td class="a-nowrap">
<span class="a-letter-space"></span><span>13</span>
</td>
я смог получить 13, используя следующее регулярное выражение:
<td class="a-nowrap">\s*<span class="a-letter-space"></span><span>(\d*)</span>\s*</td>
и аналогично из
<td class="a-nowrap">
<a class="a-link-normal" title="69% of reviews have 5 stars" href="">5 star</a><span class="a-letter-space"></span>
</td>
получил 5 звезд, используя регулярное выражение
<td class="a-nowrap">\s*<a class="a-link-normal" [^>]*>\s*(.*)</a>\s*</td>
Но когда оба HTML-кода объединены,
<table id="histogramTable" class="a-normal a-align-middle a-spacing-base">
<tr class="a-histogram-row">
<td class="a-nowrap">
<a class="a-link-normal" title="69% of reviews have 5 stars" href="">5 star</a><span class="a-letter-space"></span>
</td>
<td class="a-span10">
<a class="a-link-normal" title="69% of reviews have 5 stars" href=""><div class="a-meter"><div class="a-meter-bar" style="width: 69.1358024691358%;"></div></div></a>
</td>
<td class="a-nowrap">
<span class="a-letter-space"></span><span>13</span>
</td>
</tr>
<td class="a-nowrap">
<a class="a-link-normal" title="2% of reviews have 1 stars" href="">1 star</a><span class="a-letter-space"></span>
</td>
<td class="a-span10">
<a class="a-link-normal" title="2% of reviews have 1 stars" href=""><div class="a-meter"><div class="a-meter-bar" style="width: 2.46913580246914%;"></div></div></a>
</td>
<td class="a-nowrap">
<span class="a-letter-space"></span><span>2</span>
</td>
</table>
как извлечь 5 звезд и 13, используя регулярное выражение?
Если вы не хотите использовать HTML - парсер, используйте один регулярное выражение, после того, как другой или добавить .*
Это между двумя узорами, я модифицировал чуток вашу звезду регулярного выражения, как он не работает должным образом:
Сначала включите dotall флаг (ов), а затем использовать это:
<td class="a-nowrap">\s*<a class="a-link-normal" [^>]*>\s*(\d star).*<td class="a-nowrap">\s*<span class="a-letter-space"></span><span>(\d*)</span>\s*</td>
Вывод:
Группа 1: 5 звезд
Группа 2: 13
РЕДАКТИРОВАТЬ:
Я сделал более короткое регулярное выражение:
REGEX:
>(\d star)<.+?>(\d+?)<
Что используется на pythonregex.com с отредактированным вводом, который вы предоставили, дает:
ВЫВОД:
>>> regex.findall(string)
[(u'5 star', u'13'), (u'1 star', u'2')]