python/data crawling

5. CSS selector를 이용하여 tag 찾기

Abokadoh 2023. 2. 14. 20:28

1. select, select_one 함수 사용법

  • select : 만족하는 조건의 모든 elements를 찾는다. (리스트처럼 만들어준다.)
  • select_one : 만족하는 조건의 첫번째 elements를 찾는다. (단일 결과물은 str type으로 반환)

- css selector 사용법

  • 태그명 찾기 tag
  • 자손 태그 찾기 - 자손 관계 (tag tag)
  • 자식 태그 찾기 - 다이렉트 자식 관계 (tag > tag)
  • 아이디 찾기 #id
  • 클래스 찾기 .class
  • 속성값 찾기 [name = ‘test’]
    • 속성값 prefix 찾기 [name ^=’test’]
    • 속성값 suffix 찾기 [name $=’test’]
    • 속성값 substring 찾기 [name *=’test’]
  • n번째 자식 tag 찾기 :nth-child(n)

개발자 도구에서 기사 전문은 article tag, id는 mArticle 임을 확인할 수 있다.

select 함수를 사용하여 mArticle tag를 불러보자.

 

내가 원하는 본문 외에 속성 코드 등 다양한 코드들이 같이 딸려왔다.

 

개발자 도구를 다시 살펴 보니 기사에 대한 내용은 mArticle 태그자손 태그인 p 태그에 몰려있음을 확인 할 수 있었다.

그 전에 앞서 배운 함수를 활용하기 위해 div 태그안에 있는 p태그를 추려보겠다.

arti = soup.select('div.article_view p')

arti

div 태그article_view classp tag로 select을 하면 더 좁혀진 범위를 확인할 수 있다.

 

이제 arti의 tag들을 get_text()함수를 사용하여 value만 추출하여 str로 넣어보자.

contents = ''
for text in arti:
    contents += text.get_text()

contents

완성! 

 

 

 

- select 함수 응용

select 함수는 다양하게 응용하여 사용이 가능하다.

 

'mArticle' class에 하위하는 p 태그를 선택하기위해서

soup.select('#mArticle p')

‘#클래스명 태그명’ 을 쓰면 된다. (띄어쓰기)

추가로

soup.select('h3.tit_view')

('태그명.클래스명') 도 가능하다. 다른 방법으로는

soup.select('h3[class= "tit_view"]')

첫 번째 방법을 단축키 정도로 생각하면 된다. ( 출력값이 같음)

soup.select('.tit_view')

클래스명tit_view로 갖는 모든 컨텐츠를 선택할 수 있다.

soup.select('h3[class^="tit_b"]')

class^ 으로 클래스를 찾으면 “~”으로 시작하는 class를 찾는다.

soup.select('h3[class$="view"]')

class$ 으로 클래스를 찾으면 “~”으로 끝나는 class를 찾는다.

soup.select('h3[class*="_"]')

class* 으로 클래스를 찾으면 시작, 끝 관계없이 “~”을 부분적으로 포함하는 class를 찾는다.

soup.select('span.txt_info')

span 태그txt_info 클래스를 갖는 것을 출력해보자.

해당 조건을 만족하는 결과물은 두 개인 것으로 보인다. 이것을

soup.select('span.txt_info')[0]

과 같은 방법으로 원하는 내용을 출력할 수 있고

 

soup.select('span.txt_info:nth-child(1)')

:nth-child(n) 을 사용하여 출력도 가능하다.

 

단, 첫 번째 방법은 결과물로 Tag값인 str을 출력하지만, 두 번째 방법은 ResultSet인 리스트로 출력한다.