Вот отличная версия, основанная на некотором коде выше, на случай, если это поможет. Во всяком случае, это коротко. Условно включает голову и хвост (если они не пусты). Последняя часть представляет собой демонстрационный / тестовый сценарий.
List splitWithTokens(str, pat) {
def tokens=[]
def lastMatch=0
def m = str=~pat
while (m.find()) {
if (m.start() > 0) tokens << str[lastMatch..<m.start()]
tokens << m.group()
lastMatch=m.end()
}
if (lastMatch < str.length()) tokens << str[lastMatch..<str.length()]
tokens
}
[['<html><head><title>this is the title</title></head>',/<[^>]+>/],
['before<html><head><title>this is the title</title></head>after',/<[^>]+>/]
].each {
println splitWithTokens(*it)
}
Ошибка, которую вы получаете, когда попытка загрузки происходит из-за того, что вызов urllib
является совершенно новым сеансом для их сервера - у него нет файлов cookie и аутентификации, которые использует ваш браузер. Например. это то же самое, что если вы откроете режим инкогнито в браузере и вставите в адресную строку атрибут src - для сервера вы новый клиент, который не заполнил форму, вошел в систему и т. д.
Возможно, вы захотите попробовать что-то еще - в сеансе селен / браузер, сделав снимок экрана только с элементом <img>
. Эта операция с переменным успехом, например, Chrome добавил ее поддержку только недавно, а в некоторых ситуациях она терпит неудачу:
found = browser.find_element_by_css_selector('img[alt="labelImage"]')
try:
found.screenshot('element.png')
except Exception as ex: # FIXME: anti-pattern - I don't recall the exact exception - when you run the code, change it to the proper one
print('The correct exception is {}'.format(ex))
browser.get_screenshot_as_file('page.png')
Если не удается сделать снимок экрана элемента, вы получите одну страницу целиком - который вы можете затем обрезать до элемента.