정규식 일치의 일부 추출


130

HTML 페이지에서 제목을 추출하는 정규식을 원합니다. 현재 나는 이것을 가지고있다 :

title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
    title = title.replace('<title>', '').replace('</title>', '') 

태그를 제거 할 필요가 없도록 <title>의 내용 만 추출하는 정규식이 있습니까?


5
와우 나는 단순한 제목을 추출하기 위해 전체 HTML 페이지를 구문 분석하기 위해 호출하는 모든 응답을 믿을 수 없습니다. 과잉!
hoju 2009-08-27

4
질문 제목이 모든 것을 말해 - 주어진 예제는 어떻게 HTML로하지만, 일반적으로 문제가 ... 일반.
Phil

답변:


208

( )regexp 및 group(1)python 에서 사용 하여 캡처 된 문자열을 검색합니다 ( 결과를 찾지 못하면 re.search반환 None되므로 직접 사용하지 마십시오group() ).

title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE)

if title_search:
    title = title_search.group(1)

1
제목이 없는데 아무것도하지 않는다면 group ()을 직접 사용하는 것이 왜 나쁜 일입니까? (어쨌든 예외를 잡을 수 있습니다)
tonfa

1
예,하지만 대부분의 사람들은 예외를 잊어 버리고 런타임에 예외를보고 정말 놀랐습니다. :)
Krzysztof Krasoń 2009-08-25

달리는 것을 잊지 마세요. import re그렇지 않으면 얻을 수 있습니다NameError: name 're' is not defined
Powers

16

시작 Python 3.8할당 표현식 (PEP 572) ( :=연산자) 의 도입으로 if 조건 내에서 직접 일치 결과를 변수로 캡처하고 조건의 본문에서 다시 사용 하여 Krzysztof Krasoń의 솔루션 을 약간 개선 할 수 있습니다. :

# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
  title = match.group(1)
# hello

6

캡처 그룹을 사용해보십시오.

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)


4

뷰티플 스프를 추천합니다. Soup은 모든 html 문서를 파싱하기에 아주 좋은 라이브러리입니다.

soup = BeatifulSoup(html_doc)
titleName = soup.title.name

추가하고 싶습니다. beautifulsoup도 불완전한 html을 파싱합니다. 정말 좋습니다.
Endre

3

시험:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)

HTML 구문 분석에 REGEX를 사용하려면 None을 반환 할 수 있으므로 일치시 직접 .group ()을 실행하지 마십시오.
iElectric

문서에 .*?여러 개가있는 경우에 사용해야 </title>합니다 (가능성은 없지만 알 수 없음).
tonfa 2009-08-25

@iElectric : 정말로 원한다면 블록을 제외하고 시도 할 수 있습니다.
tonfa

3

코드의 제공 조각에 대처하지 않는 Exceptions 내가 제안 할 수 있습니다

getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]

패턴을 찾지 못한 경우 기본적으로 빈 문자열을 반환하거나 첫 번째 일치 항목을 반환합니다.


1

이것으로 충분하다고 생각합니다.

#!python
import re
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE)
pattern.search(text)

... 텍스트 (HTML)가 "text"라는 변수에 있다고 가정합니다.

이것은 또한 HTML TITLE 태그 내에 합법적으로 삽입 될 수있는 다른 HTML 태그가없고 그러한 컨테이너 / 블록 내에 다른 <문자를 합법적으로 삽입 할 방법이 없다고 가정합니다.

그러나 ...

Python에서 HTML 구문 분석에 정규식을 사용하지 마십시오. HTML 파서를 사용하십시오! (여러 HTML, SGML 및 XML 파서가 이미 표준 라이브러리에있을 때 추가 작업이 될 전체 파서를 작성하지 않는 한.

"실제" 태그를 HTML (SGML / XML 유효성 검사기를 자주 준수하지 않는 경우가 많음)을 처리하는 경우 BeautifulSoup 을 사용하십시오. 패키지 . (아직) 표준 라이브러리에는 없지만이 목적으로 널리 권장됩니다.

또 다른 옵션은 lxml ...입니다. 이것은 적절하게 구조화 된 (표준 준수) HTML 용으로 작성되었습니다. 그러나 BeautifulSoup을 파서로 사용하는 대체 옵션이 있습니다 : ElementSoup .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.