Python 2.7 Прекрасный экстракт Img Src Soup

for imgsrc in Soup.findAll('img', {'class': 'sizedProdImage'}):
    if imgsrc:
        imgsrc = imgsrc
    else:
        imgsrc = "ERROR"

patImgSrc = re.compile('src="(.*)".*/>')
findPatImgSrc = re.findall(patImgSrc, imgsrc)

print findPatImgSrc

'''
<img height="72" name="proimg" id="image" class="sizedProdImage" src="http://imagelocation" />

Это то, что я пытаюсь извлечь, и получаю:

findimgsrcPat = re.findall(imgsrcPat, imgsrc)
File "C:\Python27\lib\re.py", line 177, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer

'' '

Ответы

Ответ 1

Вы передаете beautifulsoup node в re.findall. Вы должны преобразовать его в строку. Попробуйте:

findPatImgSrc = re.findall(patImgSrc, str(imgsrc))

Еще лучше, используйте инструменты beautifulsoup:

[x['src'] for x in soup.findAll('img', {'class': 'sizedProdImage'})]

дает вам список всех атрибутов src для тегов img класса sizeProdImage.

Ответ 2

Существует более простое решение:

 soup.find('img')['src']

Ответ 3

Вы создаете объект re, а затем передаете его в re.findall, который ожидает строку как первый аргумент:

patImgSrc = re.compile('src="(.*)".*/>')
findPatImgSrc = re.findall(patImgSrc, imgsrc)

Вместо этого используйте метод .findall только что созданного объекта patImgSrc:

patImgSrc = re.compile('src="(.*)".*/>')
findPatImgSrc = patImgSrc.findall(imgsrc)

Ответ 4

В моем примере htmlText содержит тег img, но он также может использоваться для URL-адреса. См. Мой ответ здесь

from BeautifulSoup import BeautifulSoup as BSHTML
htmlText = """<img src="https://src1.com/" <img src="https://src2.com/" /> """
soup = BSHTML(htmlText)
images = soup.findAll('img')
for image in images:
    print image['src']