2009-03-21 3 views
2

학교 도서관에서 구독하고있는 자료 목록에서 자원/데이터베이스 이름 및 ID 목록을 가져 오려고합니다. 다른 리소스를 나열하는 페이지가 있으며 urllib2를 사용하여 페이지를 가져올 수 있지만 BeautifulSoup에 페이지를 전달하면 목록의 첫 번째 리소스에 대한 항목의 끝 부분 바로 전에 트리가 잘립니다. 문제는 검색 세트에 리소스를 추가하는 데 사용되는 이미지 링크에있는 것 같습니다. 이 일이 잘릴 경우, 여기있는 HTML이다 :Beautiful Soup가이 페이지를 자르는 이유는 무엇입니까?

<a href="http://www2.lib.myschool.edu:7017/V/ACDYFUAMVRFJRN4PV8CIL7RUPC9QXMQT8SFV2DVDSBA5GBJCTT-45899?func=find-db-add-res&amp;resource=XYZ00618&amp;z122_key=000000000&amp;function-in=www_v_find_db_0" onclick='javascript:addToz122("XYZ00618","000000000","myImageXYZ00618","http://discover.lib.myschool.edu:8331/V/ACDYFUAMVRFJRN4PV8CIL7RUPC9QXMQT8SFV2DVDSBA5GBJCTT-45900");return false;'> 
    <img name="myImageXYZ00618" id="myImageXYZ00618" src="http://www2.lib.myschool.edu:7017/INS01/icon_eng/v-add_favorite.png" title="Add to My Sets" alt="Add to My Sets" border="0"> 
</a> 

그리고 여기 내 파이썬 코드 :

BeautifulSoup로의 버전에서
import urllib2 
from BeautifulSoup import BeautifulSoup 
page = urllib2.urlopen("http://discover.lib.myschool.edu:8331/V?func=find-db-1-title&mode=titles&scan_start=latp&scan_utf=D&azlist=Y&restricted=all") 
print BeautifulSoup(page).prettify 

, 오프닝 <a href...>가 표시되지만 <img>하지 않는, <a>은 열린 태그의 나머지 부분과 마찬가지로 즉각 닫히고 </html>까지 계속됩니다.

"add to sets"이미지에서 볼 수있는 유일한 구별 특성은 name 및 id 특성을 갖는 유일한 특성입니다. 나는 그것이 왜 BeautifulSoup이 즉시 파싱을 멈추게하는지 알 수 없다.

참고 : 저는 거의 완전히 파이썬에 대해 새지만, 제대로 이해하고있는 것처럼 보입니다.

도움 주셔서 감사합니다.

+0

에서 사람들이 볼 수있는 코드를 게시 할 수 있습니까? 과거에는 아름다운 스프를 많이 사용했습니다. 이것은 할 일처럼 들리지 않습니다. – Vasil

+0

잘라낸 후 * 올바른 부분을 붙여 넣으면 원본 html 파일에서 가져옵니다. – nosklo

+0

이제는 BS와 다른 HTML 사본을보고 있다는 것을 알게되었으므로 질문을 편집하거나 내 대답을 아래쪽에 두어야합니까? 그리고 너 무슨 뜻이야, 누스 클로? – Tim

답변

2

필자는 Firefox의 "보기 선택 소스"를 사용하고 있었는데 분명히 나를 위해 HTML을 정리합니다. 내가 원래 소스를 볼 때,이 내가 border="0" 속성 뒤에 공백을 둬서

<img name="myImageXYZ00618" id="myImageXYZ00618" src='http://www2.lib.myschool.edu:7017/INS01/icon_eng/v-add_favorite.png' alt='Add to My Sets' title='Add to My Sets' border="0"title="Add to clipboard PAIS International (CSA)" alt="Add to clipboard PAIS International (CSA)"> 

을보고 무엇을, 나는 페이지를 구문 분석 BS를 얻을 수 있습니다.

0

정확하게 기억하면 BeautifulSoup은 나무의 이름에 "name"을 사용합니다. 이 경우 "a"는 앵커 태그의 "이름"이됩니다.

그래도 문제가 해결되지 않는 것 같습니다. 어떤 버전의 Python과 BS를 사용하고 있습니까?

2

나는 아름다운 수프 대신에 html5lib + lxml을 사용할 것을 강력히 권장합니다. 그것은 실제 HTML 파서 (Firefox의 것과 매우 유사)를 사용하며 lxml은 결과 트리 (css-selector 또는 xpath)를 쿼리하는 매우 유연한 방법을 제공합니다.

BeautifulSoup에는 많은 버그 또는 이상한 동작이있어서 신뢰할 수없는 많은 HTML 마크 업을위한 최상의 솔루션이 아닙니다.

+0

팁 주셔서 감사. BeautifulSoup이 나에게 더 많은 문제를 일으키는 경우 시도해 보겠습니다. – Tim

관련 문제