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']