2010-08-03 48 views

Trả lời

28

Nếu bạn đang sử dụng regex:

import re 
def striphtml(data): 
    p = re.compile(r'<.*?>') 
    return p.sub('', data) 

>>> striphtml('<a href="foo.com" class="bar">I Want This <b>text!</b></a>') 
'I Want This text!' 
+1

này sẽ chỉ làm việc HTML đáng tin cậy trên cũng như hình thành (ví dụ, không được thoát '<' or '>' bên ngoài các thẻ thực tế, không có thẻ bị thay đổi như '

+0

Vui lòng thêm rõ hơn về các tình huống rất hạn chế, đó sẽ là ý tưởng hay và tôi sẽ xóa bỏ phiếu bầu của mình. Cảm ơn bạn. – Trufa

+4

cộng với điều này cũng sẽ xóa văn bản sau => "nếu 3 < 5 then 5 > 3" – Shaokan

-1

Tùy thuộc vào việc các văn bản sẽ chứa '>' hoặc '<' Tôi sẽ hoặc là chỉ làm một chức năng để loại bỏ bất cứ điều gì giữa những, hoặc sử dụng một phân tích cú pháp lib

def cleanStrings(self, inStr): 
    a = inStr.find('<') 
    b = inStr.find('>') 
    if a < 0 and b < 0: 
    return inStr 
    return cleanString(inStr[a:b-a]) 
10

AFAIK sử dụng regex là một ý tưởng tồi cho phân tích cú pháp HTML, bạn sẽ khấm khá hơn sử dụng một phân tích cú pháp HTML/XML như beautiful soup.

+5

+1 cho Súp đẹp – derekerdmann

+0

Tôi đang sử dụng beautifulsoup, nhưng tôi cũng muốn có thể tách thẻ html theo cách thủ công. cảm ơn! – Blankman

+1

@Blankman sẽ là một ý tưởng hay khi đề cập đến trong câu hỏi của bạn – volting

3

Sử dụng SGMLParser. regex hoạt động trong trường hợp đơn giản. Nhưng có rất nhiều sự phức tạp với HTML mà bạn không phải giải quyết.

>>> from sgmllib import SGMLParser 
>>> 
>>> class TextExtracter(SGMLParser): 
...  def __init__(self): 
...   self.text = [] 
...   SGMLParser.__init__(self) 
...  def handle_data(self, data): 
...   self.text.append(data) 
...  def getvalue(self): 
...   return ''.join(ex.text) 
... 
>>> ex = TextExtracter() 
>>> ex.feed('<html>hello &gt; world</html>') 
>>> ex.getvalue() 
'hello > world' 
+0

Cảm ơn bạn, đã tìm kiếm một thời gian cho giải pháp như vậy không yêu cầu sự phụ thuộc bên ngoài. Thay đổi * ''. Join (ex.text) * thành * ''. Join (self.text) * làm cho nó phù hợp ngay cả khi là một lớp độc lập. – hasienda

8

Sử dụng lxml.html. Nó nhanh hơn rất nhiều so với BeautifulSoup và văn bản thô là một lệnh duy nhất.

>>> import lxml.html 
>>> page = lxml.html.document_fromstring('<!DOCTYPE html>...</html>') 
>>> page.cssselect('body')[0].text_content() 
'...' 
+2

Giải pháp tuyệt vời, cảm ơn! Sử dụng đoạn mã này để trích xuất văn bản từ các đoạn HTML: 'lxml.html.fromstring ('một số đoạn HTML'). Text_content()' – Adam

+1

Đây phải là câu trả lời được chấp nhận. Sử dụng regex để phân tích cú pháp HTML (đặc biệt là trực tiếp của internet) là một ý tưởng RẤT ** xấu **! –

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