테스트 사이트 - 개발 중인 베타 버전입니다

정규식 질문입니다. 특정 태그 사이 내용 추출 채택완료

Policia 4년 전 조회 3,595

</p>

<p>//ex</p>

<p><div class="content_div" id="test"></p>

<p> <div class="content"></p>

<p>  <div class="content-style"></p>

<p>    <p>내용내용</p></p>

<p>    <div>내용</div></p>

<p>    <p>내용</p></p>

<p>    <div>내요오옹</div></p>

<p>  </div></p>

<p> </div></p>

<p></div></p>

<p>

 

이런식으로 된 html구조가 있는데 여기서 div.content-style 안의 내용을 추출하고싶습니다(태그포함해서)

div.content-style 안의 내용은 계속 바뀝니다

 

처음에는

'<div[^>]*class="content-style"[^>]*>(.*?)<\/div>/is'

이런식으로 추출했었지만 해당 태그안에 div태그가 들어가있으면 정상적으로 추출을 못하드라구요... </div>가 내용안에 들어가있어서 그런것같은데 흠 딱 해당 태그 안의 내용(태그포함)만 추출하는 방법이있을까요?

댓글을 작성하려면 로그인이 필요합니다.

답변 4개

채택된 답변
+20 포인트
4년 전

1. 정규식에서 ? 제거   '<div[^>]*class="content-style"[^>]*>(.*)<\/div>/is'

이렇게 하면 뒤에 </div> 까지 싹 붙어서 올겁니다.그담에 

2. '<div>(.*?)<\/div>/is' 로 매칭해서 검색된 div 만 추출

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

P
Policia
4년 전
감사합니다 1번까지만 해도 가장 원하는 결과네요!

댓글을 작성하려면 로그인이 필요합니다.

I
4년 전

안녕하세요? ^-^

 

말씀하신 환경에서 Python을 사용하실 수 있는지 여부를 모르겠지만,

 

BeautifulSoup을 활용하여 Python으로 스크립트를 작성해봤네요 :)

 

</p>

<p>from bs4 import BeautifulSoup</p>

<p> </p>

<p>html = '''<div class="content_div" id="test"></p>

<p> <div class="content"></p>

<p>  <div class="content-style"></p>

<p>    <p>내용내용</p></p>

<p>    <div>내용</div></p>

<p>    <p>내용</p></p>

<p>    <div>내요오옹</div></p>

<p>  </div></p>

<p> </div></p>

<p></div>'''</p>

<p> </p>

<p>soup = BeautifulSoup(html, 'html5lib')</p>

<p>content = soup.find('div', {'class' : 'content-style'}).children</p>

<p>for c in content:</p>

<p>    print(c, end='')</p>

<p>

 

실행결과 : 

<p>내용내용</p>
<div>내용</div>
<p>내용</p>
<div>내요오옹</div>

 

그럼 아무쪼록 문제를 잘 해결하시고, 남은 4월 뜻깊게 잘 마무리하세요~ ^^

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

B
4년 전

* 대충 활용하기

- https://mac-blog.org.ua/regex-for-div-and-it-content/

</p>

<p>$html = '//ex

<div class="content_div" id="test">

 <div class="content">

  <div class="content-style">

    <p>내용내용</p>

    <div>내용</div>

    <p>내용</p>

    <div>내요오옹</div>

  </div>

 </div>

</div>';

preg_match('#<div\s+class="content-style"[^>]*>((?:(?:(?!<div[^>]*>|</div>).)+|<div[^>]*>[\s\S]*?</div>)*)</div>#six', $html, $match);

print_r($match);</p>

<p>/*</p>

<p>Array

(

    [0] => <div class="content-style">

    <p>내용내용</p>

    <div>내용</div>

    <p>내용</p>

    <div>내요오옹</div>

  </div>

    [1] =>

    <p>내용내용</p>

    <div>내용</div>

    <p>내용</p>

    <div>내요오옹</div>

 

)</p>

<p>*/</p>

<p>$result = $match[0].'</div>';</p>

<p>// 또는</p>

<p>$result = '<div class="content-style">'.$match[1].'</div>';</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

P
Policia
4년 전
감사합니다 이것도 가장 원하던 값이네요!

댓글을 작성하려면 로그인이 필요합니다.

jquery 쓰면 안 될까요?
$('div.content-style').html()

php에서 해야 한다면

https://simplehtmldom.sourceforge.io/

한번 써 보세요.

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

P
Policia
4년 전
둘다 쓰기 힘든 환경이네요 ㅠㅠ 두번째껀 지금 질문을 떠나 좋은 소스네요
나중에 참고하겠습니다 감사합니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인