Hint: tan x, x=arctan subs... ∫cos3x+sin3xsin3xdx=∫1+tan3xtan3xdx,(x=tan−1y,dx=1+y21dy)=∫1+y3y31+y21dy=∫(1+y2)(1+y3)y3+1−1dy=∫(1+y2)1−∫(1+y2)(1+y3)1dy=arctan(y)−∫1+y2ay+b+1+y3cy2+dy+edya+c=0,b+d=0,c+e=0,d+a=0,b+e=1=a=−c,b=−d,c=−e,d−c=0,−c+−c=1,c=d=−b=−a,c=d=−(1/2),a=b=e=(1/2)1+y2(1/2)y+(1/2)+1+y3−(1/2)y2+(−1/2)y+(1/2)=arctan(y)−∫1+y2(1/2)y+(1/2)+1+y3−(1/2)y2+(−1/2)y+(1/2)dy=arctan(y)−21∫1+y21+ydy+21∫1+y3y2+y−1dy∫1+y21+ydy=∫1+y21dy+∫1+y2ydy=arctan(y)+21ln∣1+y2∣R=∫1+y3y2+y−1=∫1+y3y2dy+∫1+y3y−1dy∫1+y3y2dy=31ln(1+y3)y3+1=(y+1)(y2−y+1)∫1+y3y−1dy=∫y2−y+1ay+b+y+1cdya+c=0,b−c+a=0,b+c=1,a=−c,b=2cc=1/3,b=2/3,a=−1/3∫1+y3y−1dy=∫y2−y+1(−1/3)y+2/3+y+11/3dy=−31∫y2−y+1y−2dy+31∫y+11dy=−32∫y2−y+1y−21−23dy+31ln∣y+1∣∫y2−y+1y−21−23dy=∫y2−y+1y−21dy−23∫y2−y+11dy=21ln(y2−y+1)−23∫y2−y+11dy∫y2−y+11dy=∫tan2x+1−tanx1sec2xdx=∫sec2x−tanxsec2xdx=∫cos2x1−cosxsinxcos2x1dx=∫1−cosxsinx1dx=∫2−sin2x2dxy2−y+11=c1+(ay+b)2(ay+b)′=a2y2+2aby+b2+1aca/c=1,2b/c=−1,(b2+1)/ac=1,a=c=−2b(b2+1)=(4b2),3b2=1,b=±31b=−31,a=c=32y2−y+11=321+(32y−31)232∫y2−y+11dy=32∫1+(32y−31)232dy=32arctan(32y−31)R=∫1+y3y2+y−1dy=31ln(1+y3)−32(21ln(y2−y+1)−3arctan(32y−31))+31ln(y+1)R=32ln(y+1)+32arctan(32y−1)∴Q=arctan(y)−21∫1+y21+ydy+21∫1+y3y2+y−1dy=arctan(y)−21(arctan(y)+21ln∣1+y2∣)+21(∫1+y3y2+y−1dy)=21x−41ln∣1+tan2x∣+21R=21x−41ln∣1+tan2x∣+31ln∣1+tanx∣+31arctan(32tanx−1)
이렇게라도 해봤는데… 답이 안나옴…
답은 pi/4 라고 하니, 알아서 도전바람…
끈기 있게 다시 시도…
∫cos3x+sin3xsin3xdx=∫1+tan3xtan3xdx,(x=tan−1y,dx=1+y21dy)=∫1+y3y31+y21dy=∫(1+y2)(1+y3)y3dy=∫(1+y)(1+y2)(1−y+y2)y3dyy+1a+y2+1by+c+y2−y+1dy+e=y3+y2+y+1(a+b)y2+(b+c)y+(a+c)+y2−y+1dy+ey4(a+b+d)=0,y3(b+c−a−b+e+d=1),y2(a+c−b−c+a+b+e+d)=0,y(−a−c+b+c+e+d)=0,a+c+e=0a+c+e=0,−a+b+e+d=0,2a+e+d=0,−a+c+d+e=1,a+b+d=0b+d=−a,−2a+e=0,e=2a,c=−3a,d=−4a,−a−3a−4a+2a=1a=−1/6,c=1/2,e=−1/3,d=2/3,b=−1/2Q=∫y+1−1/6+y2+1(−1/2)y+(1/2)+y2−y+1(2/3)y+(−1/3)dy=−61ln(y+1)−21∫y2+1y−1dy+31∫y2−y+12y−1dy=−61ln(y+1)−21∫y2+1ydy+21∫y2+11dy+31ln(y2−y+1)=−61ln(y+1)−41ln(y2+1)+21arctan(y)+31ln(y2−y+1)x= 0 to pi/2 , y=0 to inf. y=tan(x)=21x+121(4ln(y2−y+1)−2ln(y+1)−3ln(y2+1))=21x+121ln((y+1)2(y2+1)3(y2−y+1)4)(x=0,thenQ=0)(x=π/2,thenQ=π/4,(y→∞limlnO(y8)O(y8)=ln1=0))∴Q=4πQ=21x+121ln((y+1)2(y2+1)3(y2−y+1)4)=21x+121ln((1+tanx)2(1+tan2x)3(1+tan2x−tanx)4)=21x+121ln((1+tanx)2(secx)6(sec2x−tanx)4)=21x+61ln((1+tanx)(secx)3(sec2x−tanx)2)=21x+31ln(cos2x1−cosxsinx)−61ln(cos4xcosx+sinx)=21x+31ln(1−cosxsinx)−32ln(cosx)−61ln(cosx+sinx)+32ln(cosx)=21x+31ln(1−cosxsinx)−61ln(cosx+sinx)+C
print로 출력할 수도 있지만 보통 내용이 많아 파일로 저장해서 분석한다.
스트링 검색으로 원하는 부분을 잘 찾는다.
2단계 HTML 파싱하여 필요한 부분만 뽑기
HTML 내용에서 일부만을 발췌하고 싶다면 HTML 구조를 파악하여 어떻게 필요한 부분만을 select 할 수 있는 방법을 알아야 한다. BeautifulSoup 모듈을 사용하면 그나마 쉽게(?) 추출할 수 있다.
보통 홈페이지의 HTML은 시일이 지나면 업데이트되어 구조가 변경될 경우 기존 select 규칙이 안먹힌다. 그 때 그 때 업데이트를 해주어야 정상적으로 동작할 것이다. (아래 예제가 안돌아가면 스스로 업데이트하길 바란다.)
보통 태그로 가져오게되면 여러군데 있는 정보들이 마구 섞여서 나온다. index 번호를 잘 찾는다 해도 금방 변경될 수 있다.
그나마 좀 나은 방법은 일반적으로 태그들의 속성이나 클래스를 두어 카테고리화하여 작성한 경우가 많으므로 그 정보들로 데이터를 잘 필터링해야 한다.
클래스로 검색하려면 soup.find 또는 find_all에서 class_=“클래스명” 지정해 주고, ID로 검색하려면 파라미터에 id=“아이디” 를 추가한다.
위 a 태그들 중에 기사 제목같은 것만 뽑고 싶은데, 클래스를 잘 보면 link_news 라고 된 부분만 추출해 보자.
a 태그중 link_news 클래스 속성이 있는 것을 다 뽑았다. 여기서 딱 제목만 뽑고 싶은데…
태그내에 있는 텍스트만 추출하면?
a태그 하나씩 가져와서 텍스트만 출력하는데 텍스트 앞뒤 공백을 제거하자.
arta = soup.find_all("a", class_='link_news')for art in arta:print(art.text.strip())
output
20대↓
심상찮은 경제 2위 중국·4위 독일.. R의 공포 급속 확산
30대
'내일채움공제' 첫 5년 만기자 탄생..중기부 "정책 확대·개선하겠다"
40대
액상형 전자담배 '사용자제→중단' 권고..청소년 즉시중단
거의 다 나온 것 같은데, 쓸데없는 스트링이 더 있었다. 잘 보면 em 태그에 있는 것이 연령대 스트링이 추가된 것이다. 뒤에 기사제목이 별도의 태그가 없어서 태그로 추출도 어렵다.
이때는 내용들을 분해해서 list로 받아 index를 찾으면 된다. 하위 개체들 중 마지막이 해당 텍스트가 될 것이다.
arta = soup.find_all("a", class_='link_news')for art in arta:print( art.contents[-1].strip())
output
'내일채움공제' 첫 5년 만기자 탄생..중기부 "정책 확대·개선하겠다"
환자 1명이 '졸피뎀' 1만1456정 구입..국내 처방환자 176만명
액상형 전자담배 '사용자제→중단' 권고..청소년 즉시중단
돌아온 미세먼지의 나날들..'잿빛 하늘' 내년 봄까지 이어질 듯
구조조정 나선 LG디스플레이, 올해 적자 1조원 넘어설 듯
정부 "'개도국 포기' 논의" 농민들 불렀지만..시작부터 '아수라장'
경영난 위워크, 결국 손정의 품으로.."100억달러 더 투입"
이탄희 "검찰 전관예우 더 심각, 전화 한통 값 수천만원"
깔끔하게 제목만 뽑을 수 있었다.
좀 더 편하게 찾을 수는 없을까?
브라우저의 개발자 모드(F12 키를 누르면 나온다.)에서 원하는 텍스트를 찾아서 검사 또는 element 보기를 하면 해당 텍스트의 상위 태그 및 속성 정보들을 모두 볼 수 있다. 오른쪽창에서 해당 텍스트 위치가 있는 소스로 이동한다. 하단보면 태그 구조가 나온다.
이를 기반으로 필터링 규칙을 잘 잡으면 빨리 찾을 수 있을 것이다.
<div class="box_g box_realtime">
<h3 class="tit_g">실시간 주요 경제 뉴스</h3>
<ul category="economic" class="list_thumb">
</ul>
<a class="link_more #MAIN_NEWS#more" href="#none">더보기<span class="ico_news"></span></a>
</div>
None
안타깝게도 정보가 없다. 우리가 원하는 정보는 list_thumb 클래스ul 태그 내부인데 비어 있다.
실제로 이러한 경우가 종종 있다. 이 경우는 보통 html을 요청했을 때, javascript가 포함되어 브라우저에서 작동시켜야 내용이 채워지는 경우들이다. 따라서 html 자체만을 보는 것으로는 원하는 결과를 얻을 수 없다.
귀찮지만 이럴때는 다른 방식을 사용해야 한다.
가상의 브라우저를 만들어 JS를 구동시킨 결과를 파싱하면 되는 것이다.