Найти - Пользователи
Полная версия: собрать изображения с заданным расширением
Начало » Python для новичков » собрать изображения с заданным расширением
1
gelius
Нужно вытащить из html все ссылки на картинки в .png
ajib6ept
В чем сложность?
gelius
В отсутствии в сети нормальных примеров. Я не хардкорный питонист, с ходу свой код писать не выходит.
У меня получилось вот так:
images = lxml.html.fromstring(body)
images = images.xpath('//parent::img(re:match(@src, "(png)"))', namespaces={"re": "http://exslt.org/regular-expressions"})
print images
А вот что делать с закономерным результатом:
lxml.etree.XPathEvalError: Invalid expression
без понятия.
py.user.next
Без регулярных выражений. Функция ends-with() заменена на эквивалент, так как её нет в lxml.html из-за версий.

>>> import lxml.html
>>> 
>>> s = """
... 
... <img src="abc/1.png">
... <img src="abc/1.jpg"> 
... <img src="def/2.png"> 
... <img src="def/2.jpg">  
... 
... """
>>> 
>>> html = lxml.html.fromstring(s)
>>> 
>>> lst = html.xpath(
...   '//img'
...   '[substring(@src, string-length(@src) - 3) = ".png"]'
...   '/@src'
... )
>>> lst
['abc/1.png', 'def/2.png']
>>>

С регулярными выражениями:
>>> import lxml.html
>>> 
>>> s = """
... 
... <img src="abc/1.png">
... <img src="abc/1.jpg"> 
... <img src="def/2.png"> 
... <img src="def/2.jpg">  
... 
... """
>>> 
>>> html = lxml.html.fromstring(s)
>>> 
>>> ns = 'http://exslt.org/regular-expressions'
>>> 
>>> lst = html.xpath('//img[re:test(@src, ".png$")]/@src',
...                  namespaces={'re': ns})
>>> 
>>> print(lst)
['abc/1.png', 'def/2.png']
>>>

Описание функций http://exslt.org/regexp/functions/test/index.html
gelius
А есть возможность добавить к каждому элементу полученного списка например 'http://domain.com'?.
py.user.next
На одной странице могут быть как абсолютные ссылки, так и относительные. Нужно получить список, а потом передать его функции восстановления.
gelius
py.user.next
Нужно получить список, а потом передать его функции восстановления.
Замучил гугл этим вопросом Что за функция восстановления?
py.user.next
gelius
Что за функция восстановления?
Я имел в виду свою (самодельную) функцию восстановления.

>>> import urllib.parse
>>> 
>>> def repair(s, pref):
...     out = urllib.parse.urljoin(pref, s)
...     return out
... 
>>> repair('abc/1.png', 'http://www.domain.com')
'http://www.domain.com/abc/1.png'
>>> repair('http://www.domain.com/abc/1.png',
...        'http://www.domain.com')
'http://www.domain.com/abc/1.png'
>>>

Она может быть сложнее. Случаи разные бывают.
gelius
Честно, я так и не понял с задумкой функции восстановления. urllib.parse выдает :
ImportError: No module named parse
И в pip я ничего похожего не нашел. Не заменит:
def repair(s, pref):
	out = urllib.basejoin(pref, s)
	return out
?
С списком оно все равно работать не умеет.
py.user.next
>>> import urllib.parse
>>> 
>>> def repair(seq, base):
...     out = [buildurl(i, base) for i in lst]
...     return out
... 
>>> def buildurl(s, pref):
...     out = urllib.parse.urljoin(pref, s)
...     return out
... 
>>> base = 'http://www.domain.com'
>>> 
>>> lst = ['abc/1.png', 'def/2.png']
>>> 
>>> lst = repair(lst, base)
>>> 
>>> lst
['http://www.domain.com/abc/1.png', 'http://www.domain.com/def/2.png']
>>>

gelius
ImportError: No module named parse
Это во второй версии не было разделения.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB