<jupyter_start><jupyter_text>181215 CSS 선택자 *실제로 가장 많이 쓰는 방법* 중요! 왜?????정확하게 원하는 것만 선택하여 파싱이 가능<jupyter_code>from bs4 import BeautifulSoup
import sys
import io
html = """
<html><body>
<div id="main">
  <h1>강의목록</h1>
  <ul class="lecs">
    <li>Java 초고수 되기</li>
    <li>파이썬 기초 프로그래밍</li>
    <li>파이썬 머신러닝 프로그래밍</li>
    <li>안드로이드 블루투스 프로그래밍</li>
  </ul>
</div>
</body></html>
"""
soup = BeautifulSoup(html, 'html.parser')
print('prettify',soup.prettify())<jupyter_output>prettify <html>
 <body>
  <div id="main">
   <h1>
    강의목록
   </h1>
   <ul class="lecs">
    <li>
     Java 초고수 되기
    </li>
    <li>
     파이썬 기초 프로그래밍
    </li>
    <li>
     파이썬 머신러닝 프로그래밍
    </li>
    <li>
     안드로이드 블루투스 프로그래밍
    </li>
   </ul>
  </div>
 </body>
</html><jupyter_text>id표시에는 '''을 사용한다 따라서 "divmain"은 div에 main이라는 id라는 의미<jupyter_code>h1 = soup.select("div#main > h1")
print(h1)<jupyter_output>[<h1>강의목록</h1>]<jupyter_text>h1을 select한 변수의 type은 list이기 때문에 string을 사용할 수 없다.<jupyter_code>try:
    print(h1.string)
except Exception as ex: # 에러 종류
    print('에러 내용\n', ex) # ex는 발생한 에러의 이름을 받아오는 변수
    # 에러가 발생 했습니다 list index out of range<jupyter_output>에러 내용
 'list' object has no attribute 'string'<jupyter_text>따라서 밑에 나타난 것 같이 출력은 가능<jupyter_code>print(h1[0].string)<jupyter_output>강의목록<jupyter_text>직접 select_one을 사용하여 출력<jupyter_code>h1 = soup.select_one("div#main > h1").string
print("h1 =", h1)<jupyter_output>h1 = 강의목록<jupyter_text>class는 '.'으로 구분<jupyter_code>li_list = soup.select("div#main > ul.lecs > li")
for li in li_list:
  print("li : ", li.string)<jupyter_output>li :  Java 초고수 되기
li :  파이썬 기초 프로그래밍
li :  파이썬 머신러닝 프로그래밍
li :  안드로이드 블루투스 프로그래밍
{'fraction_non_alphanumeric': 0.15575757575757576, 'fraction_numerical': 0.015151515151515152, 'mean_word_length': 3.841642228739003, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 61, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '626661', 'license': 'MIT', 'n_tokens_mistral': 997, 'n_tokens_neox': 1184, 'n_words': 172, 'path': 'section2/2-5-4(bs4, css selector).ipynb', 'repo_name': 'IzPerfect/Python-WebCrawling', 'size': '1650'}