2012-05-07 40 views
7

Tôi đã nhìn thấy một số câu hỏi về loại bỏ các thẻ HTML từ chuỗi, nhưng tôi vẫn còn một chút không rõ ràng về cách trường hợp cụ thể của tôi cần được xử lý.Loại bỏ thẻ hình ảnh html và tất cả mọi thứ ở giữa từ một chuỗi

I have seen that nhiều bài viết khuyên bạn không dùng biểu thức thông thường để xử lý HTML, nhưng tôi nghi ngờ trường hợp của tôi có thể đảm bảo gian lận đắn của quy tắc này.

Tôi đang cố gắng để phân tích các tập tin PDF và tôi đã thành công trong việc chuyển đổi mỗi trang từ tập tin PDF mẫu của tôi vào một chuỗi UTF-32 văn bản. Khi hình ảnh xuất hiện, một thẻ kiểu HTML được chèn vào có chứa tên và vị trí của hình ảnh (được lưu ở nơi khác).

Trong một phần riêng biệt của ứng dụng của tôi, tôi cần phải thoát khỏi những thẻ hình ảnh. Vì chúng tôi chỉ chỉ xử lý các thẻ hình ảnh, tôi nghi ngờ việc sử dụng regex có thể được đảm bảo.

Câu hỏi của tôi là hai khía cạnh:

  1. Tôi có nên sử dụng một regex để loại bỏ các thẻ, hoặc nên tôi vẫn sử dụng một mô-đun phân tích cú pháp HTML như BeautifulSoup?
  2. Tôi nên sử dụng cấu trúc regex hoặc BeautifulSoup nào? Nói cách khác, tôi nên viết mã này như thế nào?

Để rõ ràng, các thẻ được cấu trúc như <img src="/path/to/file"/>

Cảm ơn!

+0

Có bất kỳ HTML nào khác trong tệp này không? Hoặc là nó không có nghĩa là gì ngoài văn bản thuần tuý và các thẻ ''? – senderle

+0

@senderle Không, không có HTML bên cạnh những thẻ, do đó lưỡng lự của tôi trong việc sử dụng một lib HTML đầy đủ. Định dạng là * luôn * cách tôi mô tả ở trên. – blz

+0

Tôi chỉ đăng một câu trả lời, nhưng đã tự hỏi, có thực sự là một dấu nháy đơn sau khi đóng> của mỗi hình ảnh, hoặc là một lỗi đánh máy? – joshcartme

Trả lời

8

tôi sẽ bỏ phiếu rằng trong trường hợp của bạn thì có thể sử dụng một biểu thức chính quy. Một cái gì đó như thế này nên làm việc:

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

tôi thấy đoạn đó ở đây (http://love-python.blogspot.com/2008/07/strip-html-tags-using-python.html)

chỉnh sửa: phiên bản này sẽ chỉ loại bỏ những sự thuộc về hình thức <img .... />:

def remove_img_tags(data): 
    p = re.compile(r'<img.*?/>') 
    return p.sub('', data) 
+0

Tôi cũng thấy trang đó trước đó, nhưng tôi hơi bối rối về regex được đề cập (lưu ý rằng tôi biết * không có gì * về regex sử dụng). Tại sao chuỗi '. *?'? Chẳng phải nó sẽ đọc một cái gì đó như ''? – blz

+1

Cách mà người đầu tiên tôi đăng lên hoạt động là xóa mọi thứ giữa < and >. Nếu bạn có các phiên bản khác của < or > trong văn bản thuần túy của mình (không phải dưới dạng thẻ html), nó sẽ loại bỏ nội dung mà nó không nên có. Tôi vừa đăng một phiên bản khác có tính chọn lọc hơn một chút. – joshcartme

+0

Tuyệt! Cảm ơn bạn rất nhiều! – blz

3

Kể từ khi văn bản này chứa chỉ thẻ hình ảnh, nó có thể là OK để sử dụng một regex. Nhưng đối với bất cứ điều gì khác bạn có lẽ tốt hơn bằng cách sử dụng một phân tích cú pháp HTML bonafide. May mắn thay Python cung cấp một! Điều này là khá trần xương - để có đầy đủ chức năng, điều này sẽ phải xử lý nhiều trường hợp góc hơn. (. Đáng chú ý nhất, XHTML kiểu thẻ rỗng (kết thúc bằng một dấu gạch chéo <... />) đều không được xử lý một cách chính xác ở đây)

>>> from HTMLParser import HTMLParser 
>>> 
>>> class TagDropper(HTMLParser): 
...  def __init__(self, tags_to_drop, *args, **kwargs): 
...   HTMLParser.__init__(self, *args, **kwargs) 
...  self._text = [] 
...   self._tags_to_drop = set(tags_to_drop) 
...  def clear_text(self): 
...   self._text = [] 
...  def get_text(self): 
...   return ''.join(self._text) 
...  def handle_starttag(self, tag, attrs): 
...   if tag not in self._tags_to_drop: 
...    self._text.append(self.get_starttag_text()) 
...  def handle_endtag(self, tag): 
...   self._text.append('</{0}>'.format(tag)) 
...  def handle_data(self, data): 
...   self._text.append(data) 
... 
>>> td = TagDropper([]) 
>>> td.feed('A line of text\nA line of text with an <img url="foo"> tag\nAnother line of text with a <br> tag\n') 
>>> print td.get_text() 
A line of text 
A line of text with an <img url="foo"> tag 
Another line of text with a <br> tag 

Và để thả img thẻ ...

>>> td = TagDropper(['img']) 
>>> td.feed('A line of text\nA line of text with an <img url="foo"> tag\nAnother line of text with a <br> tag\n') 
>>> print td.get_text() 
A line of text 
A line of text with an tag 
Another line of text with a <br> tag 
+1

Rực rỡ, cảm ơn bạn! Tôi nghĩ rằng tôi sẽ đi các tuyến đường regex cho bây giờ bởi vì nó có vẻ liên quan đến mã ít hơn (đơn giản hóa, đơn giản hóa!). – blz

0

giải pháp của tôi là:

def remove_HTML_tag(tag, string): 
    string = re.sub(r"<\b(" + tag + r")\b[^>]*>", r"", string) 
    return re.sub(r"<\/\b(" + tag + r")\b[^>]*>", r"", string) 
Các vấn đề liên quan