Programing

클래스별로 요소를 찾는 방법

lottogame 2020. 3. 3. 22:53
반응형

클래스별로 요소를 찾는 방법


Beautifulsoup을 사용하여 "클래스"속성이있는 HTML 요소를 구문 분석하는 데 문제가 있습니다. 코드는 다음과 같습니다

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div["class"] == "stylelistrow"):
        print div

스크립트가 끝나고 "후"같은 줄에 오류가 발생합니다.

File "./beautifulcoding.py", line 130, in getlanguage
  if (div["class"] == "stylelistrow"):
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup.py", line 599, in __getitem__
   return self._getAttrMap()[key]
KeyError: 'class'

이 오류를 어떻게 제거합니까?


BS3를 사용하여 주어진 클래스의 div 만 찾도록 검색을 구체화 할 수 있습니다.

mydivs = soup.findAll("div", {"class": "stylelistrow"})

설명서에서 :

Beautiful Soup 4.1.2부터 키워드 인수를 사용하여 CSS 클래스로 검색 할 수 있습니다 class_ .

soup.find_all("a", class_="sister")

이 경우 다음 중 하나입니다.

soup.find_all("div", class_="stylelistrow")

또한 다음과 같이 작동합니다.

soup.find_all("div", class_="stylelistrowone stylelistrowtwo")

업데이트 : 2016 beautifulsoup 최신 버전에서 'findAll'메소드의 이름이 'find_all'로 변경되었습니다. 공식 문서로 연결

분석법 이름 목록이 변경됨

따라서 대답은

soup.find_all("html_element", class_="your_class_name")

간단한 방법은 다음과 같습니다.

soup = BeautifulSoup(sdata)
for each_div in soup.findAll('div',{'class':'stylelist'}):
    print each_div

findAll 이 아닌 findAll 의 케이스를 가져와야합니다.


BeautifulSoup 3에만 해당 :

soup.findAll('div',
             {'class': lambda x: x 
                       and 'stylelistrow' in x.split()
             }
            )

이 모든 것을 찾을 수 있습니다 :

<div class="stylelistrow">
<div class="stylelistrow button">
<div class="button stylelistrow">

클래스별로 요소를 찾는 방법

Beautifulsoup을 사용하여 "class"속성을 사용하여 html 요소를 구문 분석하는 데 문제가 있습니다.

하나의 클래스로 쉽게 찾을 수 있지만 두 클래스의 교차로 찾으려면 조금 더 어렵습니다.

로부터 문서 (강조는 추가) :

둘 이상의 CSS 클래스 와 일치 하는 태그를 검색 하려면 CSS 선택기를 사용해야합니다.

css_soup.select("p.strikeout.body")
# [<p class="body strikeout"></p>]

명확하게하기 위해, 이는 취소 선과 본문 클래스 인 p 태그 만 선택합니다.

의 교차점에 대한 찾으려면 어떤 클래스의 집합 (안 교차로,하지만 노조)에서 것은, 당신은에 대한 목록을 제공 할 수 있습니다 class_(4.1.2)을 키워드 인수 :

soup = BeautifulSoup(sdata)
class_list = ["stylelistrow"] # can add any other classes to this list.
# will find any divs with any names in class_list:
mydivs = soup.find_all('div', class_=class_list) 

또한 findAll의 이름이 camelCase에서 더 Pythonic로 바뀌 었습니다 find_all.


CSS 선택기

싱글 클래스 첫 경기

soup.select_one('.stylelistrow')

경기 목록

soup.select('.stylelistrow')

복합 클래스 (즉, AND 다른 클래스)

soup.select_one('.stylelistrow.otherclassname')
soup.select('.stylelistrow.otherclassname')

복합 클래스 이름의 공백은 class = stylelistrow otherclassname"."으로 대체됩니다. 수업을 계속 추가 할 수 있습니다.

클래스 목록 (또는 존재하는 항목과 일치)

soup.select_one('.stylelistrow, .otherclassname')
soup.select('.stylelistrow, .otherclassname')

bs4 4.7.1 +

innerText문자열을 포함하는 특정 클래스

soup.select_one('.stylelistrow:contains("some string")')
soup.select('.stylelistrow:contains("some string")')

특정 하위 요소가있는 특정 클래스 (예 : a태그)

soup.select_one('.stylelistrow:has(a)')
soup.select('.stylelistrow:has(a)')

다음과 같이 div에 클래스 속성이 있는지 먼저 확인하십시오.

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
    if "class" in div:
        if (div["class"]=="stylelistrow"):
            print div

이것은 클래스 속성에 액세스하는 데 도움이됩니다 (beautifulsoup 4에서는 설명서의 내용과 반대). KeyError는 사전이 아닌 목록을 반환합니다.

for hit in soup.findAll(name='span'):
    print hit.contents[1]['class']

BeautifulSoup 4+ 기준으로

단일 클래스 이름이있는 경우 클래스 이름을 매개 변수로 다음과 같이 전달할 수 있습니다.

mydivs = soup.find_all('div', 'class_name')

또는 하나 이상의 클래스 이름이있는 경우 클래스 이름 목록을 다음과 같은 매개 변수로 전달하십시오.

mydivs = soup.find_all('div', ['class1', 'class2'])

이것은 나를 위해 일했다 :

for div in mydivs:
    try:
        clazz = div["class"]
    except KeyError:
        clazz = ""
    if (clazz == "stylelistrow"):
        print div

다음은 나를 위해 일했습니다.

a_tag = soup.find_all("div",class_='full tabpublist')

이것은 작동해야합니다 :

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div.find(class_ == "stylelistrow"):
        print div

참고 URL : https://stackoverflow.com/questions/5041008/how-to-find-elements-by-class



반응형