2017-12-17 3 views
0

웹 사이트에서 모든 제품 이름을 가져 오기 위해 웹 사이트 스크레이퍼를 만들고 있습니다. 제품 제목을 찾으려고 할 때 KeyError가 계속 발생합니다.bs4 Selectors Not Takeing "image : title"

HTML :

<url> 
    <loc> 
    https://shop.havenshop.ca/products/cassady-sunglasses-indigo-gunmetal 
    </loc> 
    <lastmod>2017-10-19T08:53:44-07:00</lastmod> 
    <changefreq>daily</changefreq> 
    <image:image> 
    <image:loc> https://cdn.shopify.com/s/files/1/0051/7042/products/Cassady_SunglassesIndigoGunmetal1.jpg?v=1436564480</image:loc> 
    <image:title>"Cassady" Sunglasses Indigo/Gunmetal</image:title> 
    </image:image> 
</url> 

파이썬 코드 :

session = requests.session() 
sitemap = session.get(link) 
data = sitemap.text 
soup = BeautifulSoup(data, "lxml") 
items = soup.find_all("url") 
for i in range(len(items)): 
    for item in items[i]: 
     print items[i]["image:image"]["image:title"] 

오류 :, 즉 XML이

HTML되지
KeyError: 'image:title' 
+0

인쇄 키 '인쇄 (항목 [I] [ "이미지 : 이미지"]. 키())' – furas

+0

루프 내 내부 인'항목에서 항목 [I] : ', 왜'items [i] [ "image : image"] [ "image : title"]'? item [ "image : image"] [ "image : title"]'이 아니겠습니까? –

+0

@JohnGordon이 "TypeError : 문자열 인덱스가 정수 여야합니다." – Michael

답변

1

입니다. 속성을 통해 액세스하려고 시도하는 대신 네임 스페이스가 지정된 요소를 찾아야합니다. 이것은 당신에게 당신의 가치를 줄 것이다 :

items[i].find('image.title') 

전체 예 :

for url in soup.find_all('url'): 
    if 'Cassady' in url.find('image:title').text: 
     print(url.find('image:loc').text) 
+0

이것은 none 유형을 반환합니까? – Michael

+0

'items [0] .find ('image : title')''"Cassady"선글래스 인디고/건담'을 반환합니다. 코드에는 다른 많은 오류가 있습니다. 아마도 그 중 하나 일 것입니다. – Vetsin

+0

내가 사용하고있는 루프는 태그를 모두 가지고 있습니다. 그래서 이미지 : 제목이 "Cassady"선글래스 인디고/건메탈이 될 때까지 진행할 것입니다. 태그 인 태그를 반환하고 싶습니다. – Michael

0

최선의 선택이 BS4 솔루션과 함께 할 것입니다 :

그냥 의견 :

당신은 모든하려면 제품 이름 다음 원하는 경우 정규식을 사용할 수도 있습니다.

import re 
pattern=r'<image:title>"(\w.+?)<\/image:title>' 
with open('file.txt','r') as f: #instead of file you can directly pass the url content via bs4 parser 
    match=re.finditer(pattern,f.read()) 
    for i in match: 
     print(i.group(1)) 

출력 : 사전

Cassady" Sunglasses Indigo/Gunmetal