2009-05-11 40 views
6

xem xét như sau:Python - Regex - Làm thế nào để tìm một chuỗi giữa hai bộ chuỗi

<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div> 

Làm thế nào bạn sẽ đi về lấy ra dòng sitemap với regex trong python?

<a href="/sitemap">Sitemap</a> 

Sau đây có thể được sử dụng để kéo các thẻ neo.

'/<a(.*?)a>/i' 

Tuy nhiên, có nhiều thẻ liên kết. Ngoài ra còn có nhiều hotlink (s) vì vậy chúng tôi không thể thực sự sử dụng chúng?

+0

Có thể bạn sẽ nghe thấy rằng biểu thức thông thường không phù hợp để phân tích một bối cảnh miễn phí ngôn ngữ như HTML. – Gumbo

+2

Nếu bạn là người tạo HTML đó, đáng chú ý là nhiều, các thuộc tính 'id =' giống hệt nhau không hợp lệ. Một 'class =' là thích hợp hơn. –

Trả lời

13

Không sử dụng regex. Sử dụng BeautfulSoup, một trình phân tích cú pháp HTML.

from BeautifulSoup import BeautifulSoup 

html = \ 
""" 
<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div>""" 

soup = BeautifulSoup(html) 
soup.findAll("div",id="hotlink")[2].a 

# <a href="/sitemap">Sitemap</a> 
6

Phân tích HTML bằng biểu thức chính quy là một ý tưởng tồi!

Nghĩ về những mảnh sau html

Có rất nhiều ví dụ khác như vậy. Cụm từ thông dụng phù hợp với nhiều thứ, nhưng không phải để phân tích cú pháp HTML.

Bạn nên xem xét sử dụng trình phân tích cú pháp HTML python.

Nhưng dù sao, một giải pháp ad-hoc sử dụng regex là

import re 

data = """ 
<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div> 
""" 

e = re.compile('<a *[^>]*>.*</a *>') 

print e.findall(data) 

Output:

>>> e.findall(data) 
['<a href="foo1.com">Foo1</a>', '<a href="/">Home</a>', '<a href="/extract">Extract</a>', '<a href="/sitemap">Sitemap</a>'] 
+0

Nếu bạn thay thế '. *' Bằng '(?: [^ <] + | <(!/A \ b)) *', bạn sẽ nhận được ít sai số tích cực hơn, mà không làm tăng động cơ regex bằng tính năng backtracking. –

1

Sử dụng BeautifulSoup hoặc lxml nếu bạn cần phải phân tích cú pháp HTML.

Ngoài ra, bạn thực sự cần phải làm gì? Tìm liên kết cuối cùng? Tìm liên kết thứ ba? Tìm liên kết trỏ tới/sơ đồ trang web? Nó không rõ ràng từ bạn câu hỏi. Bạn cần gì để làm với dữ liệu?

Nếu bạn thực sự phải sử dụng cụm từ thông dụng, hãy xem findall.

5

Để trích xuất nội dung của khẩu hiệu:

<a href="/sitemap">Sitemap</a> 

... Tôi sẽ sử dụng:

>>> import re 
    >>> s = ''' 
    <div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
     <div id=hotlink> 
     <a href="/">Home</a> 
     </div> 
     <div id=hotlink> 
     <a href="/extract">Extract</a> 
     </div> 
     <div id=hotlink> 
     <a href="/sitemap">Sitemap</a> 
     </div> 
    </div>''' 
    >>> m = re.compile(r'<a href="/sitemap">(.*?)</a>').search(s) 
    >>> m.group(1) 
    'Sitemap' 
+0

Thực ra, hãy thay thế sơ đồ trang web bằng XYZ vì nó thực sự có thể là bất kỳ thứ gì. Tôi chỉ biết rằng đó là div thứ ba trong div của danh sách hotlin. Mẫu html được sử dụng có thể được lặp lại nhiều lần. Giả sử tôi muốn đưa ra tất cả danh sách điện thoại thông minh trên ebay. Tôi biết rằng mẫu trên được lặp lại cho mỗi điện thoại thông minh được tìm thấy, tuy nhiên, XYZ có thể là iphone, blackberry, Nokia hoặc bất kỳ điện thoại thông minh nào khác. Không thể có mục hoặc 100. Vì vậy, tôi đang tìm kiếm một thứ có nội dung lặp lại, sau đó lấy đường dây điện thoại thông minh và có danh sách điện thoại thông minh. – un33k

+0

Tôi thích điều này vì nó trả lời câu hỏi. Nó cũng giúp tôi với sự hiểu biết regex tốt hơn có tin hay không. – Max

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