2014-09-05 4 views
0
import urllib2 
from bs4 import BeautifulSoup 

url = 'http://www.amazon.com/dp/B00IOXUJRY' 

page = BeautifulSoup(urllib2.urlopen(url)) 

print page 
title = page.find(id='productTitle') #.text.replace('\t','').strip() 
print repr(title) 

이 prodcutTitle ID의 텍스트를 가져 오려면 None을 반환합니다. 비록 내가 페이지의 값을 인쇄하고 이것이 정적 인 텍스트인지 아니면 javascript/ajax에서 오는 것인지를 체크한다. 나는 이미 1 시간을 보냈지 만 이유를 찾을 수 없습니다. 나는 내가 모르는 아주 작은 바보 같은 실수를하고있을 수 있습니까?BeautifulSoup 찾기 비정상적인 동작

추신 : 다른 질문이 하나 있습니다. "중요 정보"섹션 아래에 "제품 설명"섹션이 있습니다. 이 자바 스크립트 생성 된 콘텐츠 (나는 그렇게 생각하니 ??). 그래서 셀렌/phantomJS 종류의 라이브러리를 사용해야합니다. beautifulsoup 또는 python의 inbuilt 라이브러리 (셀렌이 너무 느리기 때문에)에서이 내용을 가져올 수있는 방법이 있습니까 mechanize 또는 robobrowser 등과 같은 다른 라이브러리는 무엇입니까?

답변

1

BeautifulSoup에 의해 사용중인 differences between parsers이 발생합니다.

당신이 명시 적으로 지정하지 않은 때문에

, BeautifulSoupchooses one automatically :

BeautifulSoup로 생성자에 첫 번째 인수는 문자열 또는 구문 분석하려는 열린 핸들 - 마크 업이다. 두 번째 인수는 마크 업을 구문 분석하려는 방법입니다 ( ).

아무 것도 지정하지 않으면 최상의 HTML 파서 인 이 설치됩니다. Beautiful Soup은 lxml의 파서를 최상으로 평가 한 다음 html5lib 's, Python에 내장 된 파서입니다.

여기 무슨 일이 일어나고 있는지의 데모입니다 :

>>> import urllib2 
>>> from bs4 import BeautifulSoup 
>>> url = 'http://www.amazon.com/dp/B00IOXUJRY' 

>>> page = BeautifulSoup(urllib2.urlopen(url), 'html.parser') 
>>> print page.find(id='productTitle') 
None 

>>> page = BeautifulSoup(urllib2.urlopen(url), 'html5lib') 
>>> print page.find(id='productTitle') 
<span class="a-size-large" id="productTitle">Keurig, The Original Donut Shop, K-Cup packs (Regular - Medium Roast Extra Bold, 24 Count)</span> 

>>> page = BeautifulSoup(urllib2.urlopen(url), 'lxml') 
>>> print page.find(id='productTitle') 
<span class="a-size-large" id="productTitle">Keurig, The Original Donut Shop, K-Cup packs (Regular - Medium Roast Extra Bold, 24 Count)</span> 

즉,이 솔루션은 명시 적으로 html5lib, 또는 lxml 중 하나를 파서를 지정하는 것입니다 -하지만 당신은 설치이 모듈이 있는지 확인하십시오.


제품 설명을 얻으려면 selenium+PhantomJS 접근 방법을 사용할 필요가 없습니다. 당신은 BeautifulSoup를 사용하여 얻을 수 있습니다 :

print page.find('div', class_='productDescriptionWrapper').text.strip() 

인쇄 :

커피 인민 도넛 숍 K-컵 커피 클래식 도넛 카운터 을에서 찾을 조의 잔을 연상시키는 중간 볶은 커피 입니다 미국 전역에 걸쳐 달콤하고 풍부한 디저트 맛으로 매 컵마다 커피를 두려워하는 사람 에게도 친숙합니다. 달콤한 풍미 세트 풍미 커피 피플 세트 도넛 평소 커피와의 차별화 된 가게 커피 리플렉션 K - 컵 싱글 서비스 로이 독특한 커피를 즐길 수 있습니다. 24 개의 K-Cup이 포함되어 있습니다.

+0

Whoaa! 정말 멋지다. 이 파서를 어느 페이지에서 사용해야하는지 어떻게 알 수 있습니까? 내 말은, 지금처럼 나는 미래에 나는 다른 파서를 시도 할 같은 오류가 발생합니다. 히트 & 재판인가, 또는 페이지를 보아 식별 할 수 있습니까? 또는 일반적으로 어떤 파서를 선호합니까? – xyz

+0

@xyz 잘, 파서는 다른 조건에서 다르다. 하나는 다른 것보다 관대하고 다른 하나는 더 빠르다. - 이것은 기본적으로 파싱하는 웹 페이지와 필요한 데이터, 얼마나 빨리 필요로 하는가에 달려있다. 개인적으로 나는 언제나'lxml'을 사용할 수 있습니다. 희망이 도움이됩니다. – alecxe