2009-08-07 7 views
37
페이지가 <div class="class1"><p class="class1">를 가지고 있다면

soup.findAll(True, 'class1')을 찾게됩니다.아름다운 수프는 객체에 다른 클래스가있는 경우 CSS 클래스를 찾을 수 없습니다.

<p class="class1 class2">이 있으면 찾지 못합니다. 다른 클래스를 가지고 있는지 여부에 관계없이 특정 클래스의 모든 오브젝트를 찾는 방법은 무엇입니까?

+3

** 업데이트 ** :이 보도에 따르면 4 베타 5에서 수정되었습니다 : https://bugs.launchpad.net/beautifulsoup/+bug/410304 – endolith

답변

15

아무도이 질문을하는 경우에 대비해. BeautifulSoup은 이제 다음을 지원합니다.

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] 
Type "copyright", "credits" or "license" for more information. 

In [1]: import bs4 

In [2]: soup = bs4.BeautifulSoup('<div class="foo bar"></div>') 

In [3]: soup(attrs={'class': 'bar'}) 
Out[3]: [<div class="foo bar"></div>] 

또한 findAll을 더 이상 입력하지 않아도됩니다.

34

불행히도 BeautifulSoup는 이것을 ['class1','class2']이 아닌 이라는 공백이있는 클래스로 취급합니다. 해결 방법은 정규식을 사용하여 문자열 대신 클래스를 검색하는 것입니다.

이 작동합니다 : 당신은 lxml를 사용해야합니다

soup.findAll(True, {'class': re.compile(r'\bclass1\b')}) 
+2

https://bugs.launchpad.net/bugs/410304 – endolith

+3

이것은 이제 수정 된 것 같습니다. – Kugel

+1

@Kugel : 다른 대답을 추가 하시겠습니까? – endolith

10

. 공백으로 구분 된 여러 클래스 값 ('class1 class2')과 함께 작동합니다.

이름에도 불구하고 lxml은 HTML 구문 분석 및 스크래핑 용으로도 사용됩니다. 그것은 BeautifulSoup보다 훨씬 빠르고 빠르며 BeautifulSoup (명성을 얻으려는 주장)보다 "고장난"HTML을 잘 처리합니다. lxml API를 배우고 싶지 않은 경우 BeautifulSoup에 대한 호환 API도 있습니다.

Ian Bicking agrees이며 BeautifulSoup에서 lxml을 선호합니다.

Google App Engine 또는 순수하게 Python이 허용되지 않는 것을 제외하고는 BeautifulSoup을 더 이상 사용할 필요가 없습니다.

CSS 선택기를 lxml과 함께 사용할 수도 있으므로 BeautifulSoup보다 사용하기가 훨씬 쉽습니다. 대화 형 Python 콘솔에서이 문제를 해결해보십시오.

+7

lxml의 설명서에서 : "libxml2 (따라서 lxml)도 깨진 HTML을 구문 분석 할 수 있지만 BeautifulSoup는 조금 더 관대하고 인코딩 감지에 대한 지원이 뛰어납니다." – endolith

+0

나는 그것을 시험해 보았는데 실제로 이런 종류의 일을하는 것이 더 좋다. – endolith

+0

당신이 좋아하는 것을 기쁘게 생각합니다. lxml은 언더 그레이트 라이브러리입니다. 저는 많은 사람들이 그것을 간과한다고 생각합니다. 그 이름에 'XML'이 있고 그 문서가 BeautifulSoup만큼 훌륭하지 않기 때문입니다. 학사는 그 이름과 그래픽으로 매력을 가지고 있는데, 이것은 표면적 인 이유로 조금 더 매력적입니다. – aehlke

2

특정 CSS 클래스가있는 태그를 검색하는 것이 매우 유용하지만 CSS 속성의 이름 인 "class"는 Python에서 예약어입니다. 클래스를 키워드 인수로 사용하면 구문 오류가 발생합니다.

처럼 : : 아름다운 수프 4.1.2, 당신은 키워드 인수 class_를 사용하여 CSS 클래스를 검색 할 수 있습니다

soup.find_all("a", class_="class1") 
+0

죄송합니다. 그러나 귀하의 대답이 잘못되었다고 생각합니다. Beautiful Soup doc (http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#Searching%20by%20CSS%20class)에 따르면 'find_all'을 사용하여 CSS 클래스 : 클래스 이름을 String으로 전달하거나 "class"키를 사용하여 dict을 만들고 CSS 클래스의 이름으로 값을 만듭니다. –

+0

다행스럽게도 내 대답을 볼 수 있지만 bs3이 아닌 bs3을 사용하고 있습니다. 아마도 @ RodrigoTaboada가 변경되었습니다. –

+0

Beautiful Soup4 doc [link] (http://www.crummy.com/software/BeautifulSoup/bs4/) doc/# searching-by-css-class) –