2009-08-25 38 views
45

Tôi muốn một cụm từ thông dụng để trích xuất tiêu đề từ một trang HTML. Hiện tại tôi có điều này:Trích xuất một phần của một kết hợp regex

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

Có biểu thức chính quy nào để trích xuất nội dung để tôi không phải xóa thẻ không?

cảm ơn!

+2

wow Tôi không thể tin tất cả các câu trả lời gọi để phân tích cú pháp toàn bộ trang HTML chỉ để trích xuất một tiêu đề đơn giản. Điều gì quá mức cần thiết! – hoju

+0

Tiêu đề câu hỏi cho biết tất cả - ví dụ đã cho _happens_ là HTML, nhưng vấn đề chung là ... chung. – Phil

Trả lời

70

Sử dụng () trong regexp và group(1) trong python để lấy chuỗi bắt (re.search sẽ trở lại None nếu nó không tìm thấy kết quả, vì vậy don' t sử dụng group() trực tiếp):

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

if title_search: 
    title = title_search.group(1) 
+0

Nếu bạn không làm bất cứ điều gì khi không có tiêu đề được tìm thấy, tại sao nó sẽ là một điều xấu để sử dụng nhóm() trực tiếp? (bạn có thể bắt được ngoại lệ) – tonfa

+0

vâng, nhưng hầu hết mọi người quên đi ngoại lệ, và thực sự ngạc nhiên khi họ thấy chúng trong thời gian chạy :) –

2

Hãy thử:

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

Nếu bạn thực sự muốn sử dụng REGEX cho phân tích cú pháp HTML, không chạy .group() trực tiếp trên khớp, vì nó có thể trả về Không. – iElectric

+0

Bạn nên sử dụng '. *?' Để trong trường hợp có nhiều '' trong tài liệu (có thể nhưng bạn không bao giờ biết). – tonfa

+0

@iElectric: bạn có thể đặt nó trong một thử trừ khối nếu bạn thực sự muốn, phải không? – tonfa

2

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

4

Hãy thử sử dụng các nhóm chụp:

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

làm ơn, đừng sử dụng regex để phân tích ngôn ngữ đánh dấu. Sử dụng lxml hoặc beautifulsoup.

+29

Nó phụ thuộc vào trường hợp sử dụng, đôi khi một giải pháp nhanh chóng và bẩn là điều mong muốn (đặc biệt là nếu bạn không muốn xử lý mọi loại đầu vào có thể). – tonfa

+3

Mất 2 phút để viết một HTML rằng những regex đó sẽ thất bại hoặc quay trở lại và do đó ăn chu kỳ CPU. – iElectric

+3

Nhưng khi cạo một trang web, chúng thường không thay đổi html của chúng với mục đích phá vỡ trình phân tích cú pháp của bạn (và trong một số trường hợp bạn đã cần phải dựa vào cấu trúc của html được tạo thay vì chỉ là cây html để trích xuất thêm thông tin) . – tonfa

2

Sử dụng cụm từ thông dụng để phân tích cú pháp HTML thường không phải là một ý tưởng hay. Bạn có thể sử dụng bất kỳ trình phân tích cú pháp HTML nào như Beautiful Soup cho điều đó. Hãy xem http://www.crummy.com/software/BeautifulSoup/documentation.html

Cũng nhớ rằng một số người, khi gặp phải sự cố, hãy nghĩ "Tôi biết, tôi sẽ sử dụng cụm từ thông dụng". Bây giờ họ có hai vấn đề.

-1

tôi nghĩ rằng đây là đủ: "text"

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

... giả định rằng văn bản của bạn (HTML) là một biến có tên Điều này cũng giả định rằng không có các thẻ HTML khác có thể được nhúng hợp pháp bên trong thẻ HTML TITLE và không có cách nào để hợp pháp nhúng bất kỳ ký tự < nào khác trong vùng chứa/khối đó.

Tuy nhiên ...

Không sử dụng biểu thức thông thường cho HTML phân tích cú pháp bằng Python. Sử dụng trình phân tích cú pháp HTML! (Trừ khi bạn định viết một trình phân tích cú pháp đầy đủ, đây sẽ là một công việc phụ khi các trình phân tích cú pháp HTML, SGML và XML khác nhau đã có trong các thư viện chuẩn.

Nếu xử lý của bạn "thế giới thực" tag soup HTML (thường là không phù hợp với bất kỳ trình xác thực SGML/XML nào), sau đó sử dụng gói BeautifulSoup. Nó không nằm trong thư viện chuẩn (chưa) nhưng được đề xuất rộng rãi cho mục đích này. được viết cho HTML có cấu trúc phù hợp (tiêu chuẩn tuân thủ) nhưng có tùy chọn dự phòng để sử dụng BeautifulSoup làm trình phân tích cú pháp: ElementSoup.

1

Tôi có thể giới thiệu bạn với Beautiful Soup.Soup là một lib rất tốt để phân tích tất cả các tài liệu html của bạn.

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

Tôi muốn thêm rằng, beautifulsoup cũng phân tích cú pháp html không hoàn chỉnh và điều đó thực sự tuyệt vời. – pyeleven

2

Các mảnh được cung cấp mã không đối phó với Exceptions Tôi có thể đề nghị

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

này trả về một chuỗi rỗng theo mặc định nếu mô hình chưa được tìm thấy, hoặc các trận đấu đầu tiên.

Các vấn đề liên quan