2011-11-27 13 views
14
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" /> 

To co staram się wydobyć z i otrzymuję:Python 2.7 Piękne Soup img src Extract

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 

''”

Odpowiedz

29

Ty przechodząc węzeł BeautifulSoup do re.findall. Musisz przekonwertować go na ciąg. Spróbuj:

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

Jeszcze lepiej, korzystać z narzędzi BeautifulSoup zapewnia:

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

daje listę wszystkich atrybutów znaczników img src klasy 'sizedProdImage'.

0

tworzysz obiekt re, a następnie przekazaniem go do re.findall który oczekuje ciąg jako pierwszy argument:

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

Zamiast używać th e .findall Sposób patImgSrc obiekt, który właśnie stworzył:

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

Wciąż otrzymuję błąd: Traceback (najnowsza rozmowę ostatnia): pliku "C: \ Users \ BuyzDirect \ Pulpit \ OverStock_Listing_Format_Tool.py", linia 50, w findPatImgSrc = patImgSrc .findall (imgsrc) TypeError: oczekiwany ciąg lub bufor – phales15

27

Jest prostsze rozwiązanie:

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

W moim przykładzie, htmlText zawiera tag img, ale może być stosowany do adresu URL zbyt. Patrz moja odpowiedź here

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