<div class="class1">
와
<p class="class1">
를 가지고 있다면
은 soup.findAll(True, 'class1')
을 찾게됩니다.아름다운 수프는 객체에 다른 클래스가있는 경우 CSS 클래스를 찾을 수 없습니다.
<p class="class1 class2">
이 있으면 찾지 못합니다. 다른 클래스를 가지고 있는지 여부에 관계없이 특정 클래스의 모든 오브젝트를 찾는 방법은 무엇입니까?
<div class="class1">
와
<p class="class1">
를 가지고 있다면
은 soup.findAll(True, 'class1')
을 찾게됩니다.아름다운 수프는 객체에 다른 클래스가있는 경우 CSS 클래스를 찾을 수 없습니다.
<p class="class1 class2">
이 있으면 찾지 못합니다. 다른 클래스를 가지고 있는지 여부에 관계없이 특정 클래스의 모든 오브젝트를 찾는 방법은 무엇입니까?
아무도이 질문을하는 경우에 대비해. 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을 더 이상 입력하지 않아도됩니다.
불행히도 BeautifulSoup는 이것을 ['class1','class2']
이 아닌 이라는 공백이있는 클래스로 취급합니다. 해결 방법은 정규식을 사용하여 문자열 대신 클래스를 검색하는 것입니다.
이 작동합니다 : 당신은 lxml를 사용해야합니다
soup.findAll(True, {'class': re.compile(r'\bclass1\b')})
. 공백으로 구분 된 여러 클래스 값 ('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 콘솔에서이 문제를 해결해보십시오.
lxml의 설명서에서 : "libxml2 (따라서 lxml)도 깨진 HTML을 구문 분석 할 수 있지만 BeautifulSoup는 조금 더 관대하고 인코딩 감지에 대한 지원이 뛰어납니다." – endolith
나는 그것을 시험해 보았는데 실제로 이런 종류의 일을하는 것이 더 좋다. – endolith
당신이 좋아하는 것을 기쁘게 생각합니다. lxml은 언더 그레이트 라이브러리입니다. 저는 많은 사람들이 그것을 간과한다고 생각합니다. 그 이름에 'XML'이 있고 그 문서가 BeautifulSoup만큼 훌륭하지 않기 때문입니다. 학사는 그 이름과 그래픽으로 매력을 가지고 있는데, 이것은 표면적 인 이유로 조금 더 매력적입니다. – aehlke
특정 CSS 클래스가있는 태그를 검색하는 것이 매우 유용하지만 CSS 속성의 이름 인 "class"는 Python에서 예약어입니다. 클래스를 키워드 인수로 사용하면 구문 오류가 발생합니다.
처럼 : : 아름다운 수프 4.1.2, 당신은 키워드 인수 class_를 사용하여 CSS 클래스를 검색 할 수 있습니다
soup.find_all("a", class_="class1")
죄송합니다. 그러나 귀하의 대답이 잘못되었다고 생각합니다. Beautiful Soup doc (http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#Searching%20by%20CSS%20class)에 따르면 'find_all'을 사용하여 CSS 클래스 : 클래스 이름을 String으로 전달하거나 "class"키를 사용하여 dict을 만들고 CSS 클래스의 이름으로 값을 만듭니다. –
다행스럽게도 내 대답을 볼 수 있지만 bs3이 아닌 bs3을 사용하고 있습니다. 아마도 @ RodrigoTaboada가 변경되었습니다. –
Beautiful Soup4 doc [link] (http://www.crummy.com/software/BeautifulSoup/bs4/) doc/# searching-by-css-class) –
** 업데이트 ** :이 보도에 따르면 4 베타 5에서 수정되었습니다 : https://bugs.launchpad.net/beautifulsoup/+bug/410304 – endolith