Сводка
Я создаю регулярное выражение для анализа веб-сайта, содержащего данные о ссылках для загрузки Android Studio . Как видите, данные представляются регулярно, поэтому я хотел использовать регулярное выражение, чтобы сделать это за один раз.
Я сделал снимок html-данных и создал следующий регулярное выражение . Это именно то, что я хочу. На самом деле это сработало лучше, чем я думал!
Вот скриншот того, что он делает. Откройте изображение, чтобы увидеть его лучше. Опять же, здесь есть веб-страница для этого регулярного выражения.
Проблема заключается в том, что я кодифицировал ее в Python. Я не получаю спичек. Я даже использовал generated
код Python, который веб-сайт предоставляет мне с моим регулярным выражением и текстом. Это работает! Однако, как только я перехожу из поддельного HTML-текста в реальные HTML-данные, мой код не выполняется. Это простое изменение в 1 строку, и я перехожу от работы к нулю.
Существующая работа
Сначала я использовал автоматически сгенерированный код , предоставленный онлайн-тестером.
Я взял следующий код (внизу) ...
matches = re.finditer(regex, test_str, re.MULTILINE)
и изменил его на ...
matches = re.finditer(regex, soup.text, re.MULTILINE)
Я также пытался soup.contents
и str(soup.text)
. Я использовал PrettyPrint (pprint
) для форматирования строки, чтобы убедиться, что в ней есть переводы строки. Ничего не работаетВсе это терпит неудачу
Код
Вот фрагмент автоматически сгенерированного кода по ссылке выше.
Примечание: Этот код работает, но как только язамените test_str
html-строкой BeautifulSoup, тогда ничего не получится.
import re
regex = r"^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:.tar.gz|.zip))\">(.*)</a>.*\((.*) bytes\))"
test_str = ("<div class=\"all-downloads hide\">\n"
"<section class=\"expandable\">\n"
...
)
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
# Ignore the following
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
Я даже пытался сделать более простую версию, не основанную на автоматически сгенерированном коде
regex = r"^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:.tar.gz|.zip))\">(?P<filename>.*)</a>.*\((.*) bytes\))"
# html_text = pprint.pformat(html.text)
html_text = soup.text # BeautifulSoup Object's text representation
matches = re.findall(regex, html_text, re.M)
print(matches)
Вывод
Я всегда получаю пустой список []
, когда я использую html-строку объекта BeautifulSoup. Всегда.