2010-04-13 23 views
6

Cơ sở dữ liệu của chúng tôi chứa đầy các bài viết được truy xuất từ ​​nguồn cấp dữ liệu RSS. Tôi không chắc chắn về dữ liệu nào tôi sẽ nhận được và lượng bộ lọc đã được thiết lập (plugin WP-O-Matic Wordpress sử dụng thư viện SimplePie). Plugin này thực hiện một số mã hóa cơ bản trước khi chèn bằng cách sử dụng chức năng chèn bài viết tích hợp của Wordpress cũng có chức năng lọc nào đó. Giữa mã hóa của nguồn cấp dữ liệu RSS, mã hóa của plugin bằng cách sử dụng PHP, mã hóa của Wordpress và SQL thoát, tôi không chắc bắt đầu từ đâu.Tôi sẽ sử dụng điều gì để xóa html thoát khỏi các tập dữ liệu lớn

Dữ liệu thường ở cuối trường sau nội dung tôi muốn giữ. Đó là tất cả trên cùng một dòng, nhưng tách ra để có thể đọc:

<img src="http://feeds.feedburner.com/~ff/SoundOnTheSound?i=xFxEpT2Add0:xFbIkwGc-fk:V_sGLiPBpWU" border="0"></img>

<img src="http://feeds.feedburner.com/~ff/SoundOnTheSound?d=qj6IDK7rITs" border="0"></img>

&lt;img src=&quot;http://feeds.feedburner.com/~ff/SoundOnTheSound?i=xFxEpT2Add0:xFbIkwGc-fk:D7DqB2pKExk&quot;

Thông báo như thế nào một số hình ảnh được thoát và một số thì không. Tôi tin rằng điều này đã làm với phần cuối cùng được cắt bỏ để không thể nhận ra như một thẻ html, mà sau đó gây ra nó để được html endcoded trong khi các thẻ img thực tế đã được để lại một mình.

kỷ lục khác có chỉ này thuộc một trong các lĩnh vực, có nghĩa là RSS feed đã cho tôi không có gì cho các mục (được lọc ra ngay bây giờ, nhưng tôi có một loạt các hồ sơ như thế này):

&lt;img src=&quot;http://farm3.static.flickr.com/2183/2289902369_1d95bcdb85.jpg&quot; alt=&quot;post_img&quot; width=&quot;80&quot;

Tất cả các mẫu được trích xuất nằm trên một dòng nhưng được chia nhỏ để dễ đọc. Nếu không, chúng được sao chép chính xác từ cơ sở dữ liệu từ dòng lệnh mysql client.

Câu hỏi: Cách tốt nhất để làm việc với html thoát trên (hoặc một phần của thẻ html), vì vậy tôi có thể xóa nó mà không ảnh hưởng đến nội dung?

Tôi muốn xóa hình ảnh, vì hình ảnh ở cuối trường thường là hình ảnh không liên quan gì đến nội dung. Trong trường hợp của feedburner, feedburner bổ sung thêm vào mỗi bài viết trong một feed. Lần khác, chúng bị hỏng liên kết xung quanh hình ảnh bị hỏng. Điểm không phải là các thẻ html img hợp lệ có thể được xóa dễ dàng. Đó là các thẻ bị xáo trộn nếu không được mã hóa sẽ không phải là html hợp lệ, sẽ không thể phân tích cú pháp với các trình phân tích cú pháp html chuẩn của bạn.

[EDIT] Nếu nó chỉ là một vấn đề kéo html tôi muốn ra ngoài và làm một strip_tags và reinserting dữ liệu, tôi sẽ không được hỏi câu hỏi này.

Phần mà tôi gặp phải sự cố là những gì từng là thẻ img được mã hóa html và kết thúc bị cắt. Nếu nó được nhúng thì sẽ không phải là thẻ html, vì vậy, tôi không thể phân tích cú pháp theo cách thông thường.

Với tất cả các &lt;img src=&quot; crap, tôi không thể tìm kiếm nó khác ngoài SELECT ID, post_content FROM table WHERE post_content LIKE '&lt;img' mà ít nhất tôi cũng có được những bài đăng đó. Nhưng khi tôi nhận được dữ liệu, tôi cần một cách để tìm nó, loại bỏ nó, nhưng giữ phần còn lại của nội dung.

[/ EDIT]

[EDIT 2]

<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="post_img" width="80" />Through the first two months of the year, the volume of cargo handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.<div> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/bizj_portland?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:qj6IDK7rITs">&lt;img src=&quot;http://feeds.feedburner.com/~ff/bizj_portland?d=qj6IDK7rITs&quot;

Phần tôi muốn giữ:

<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="post_img" width="80" />Through the first two months of the year, the volume of cargo handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.

Để nhắc lại: Nó không phải về cách xóa thẻ img html hợp lệ . Thật dễ dàng. Tôi cần để có thể tìm thấy cụ thể các &lt;img src=&quot;http://feeds.feedburner.com/~ff/bizj_portland?d=qj6IDK7rITs&quot; nếu nó là một phần của mô hình của img tag img tag thẻ img im lặng hoặc neo img neo img img hình ảnh bị mất vv vv, nhưng không loại bỏ &lt;img nếu nó thực sự là một phần của bài báo. Trong số vài chục mẫu tôi đã xem xét, nó đã được khá nhất quán rằng thẻ img này là ở cuối của lĩnh vực này.

Cách khác là thẻ hình ảnh bị xé đơn. Nó luôn là một thẻ img flickr, nhưng như trên, tôi không thể tìm kiếm &lt;img vì nó có thể là một phần hợp lệ của nội dung.

Vấn đề nằm ở chỗ tôi không thể đơn giản giải mã và phân tích cú pháp dưới dạng HTML, bởi vì nó sẽ không hợp lệ html. [/ EDIT 2]

+4

Bạn đang đùa phải không? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Ether

+1

Regex không thể phân tích cú pháp html. +1 @Ehter cho liên kết –

+0

Sử dụng cụm từ thông dụng để phân tích cú pháp HTML tùy ý thường là ý tưởng tồi nhưng tôi không chắc chắn đó là những gì bạn đang làm. Bạn đang tìm kiếm kết quả cuối cùng như thế nào? Chỉnh sửa câu hỏi của bạn ở trên và hiển thị những gì bạn muốn kết thúc với mỗi ví dụ bạn đã bao gồm. – benrifkah

Trả lời

2

Câu hỏi được cập nhật ...

Để trích xuất các dữ liệu mà bạn muốn, bạn có thể sử dụng phương pháp này:

use HTML::Entities qw/decode_entities/; 

my $decoded = decode_entities $raw; 

if ($decoded =~ s{ (<img .+? (?:>.+?</img>|/>)) } {}x) { # grab the image 
    my $img = $1; 
    $decoded =~ s{<.+?>}  {}xg; # strip complete tags 
    $decoded =~ s{< [^>]+? $} {}x; # strip trailing noise 

    print $img.$decoded; 
} 

Sử dụng một regex để phân tích cú pháp HTML thường được tán thành, tuy nhiên, trong trường hợp này, nó là nhiều hơn về tước các phân đoạn phù hợp với một mô hình. Sau khi kiểm tra các regex trên một tập dữ liệu lớn hơn, bạn nên có một ý tưởng về những gì có thể cần phải được tinh chỉnh.

Hy vọng điều này sẽ hữu ích.

+0

Tôi không có thời gian để kiểm tra, nhưng từ những gì tôi có thể thấy đây là hướng tôi muốn đi. Vì thẻ img cuối cùng không đúng định dạng, tôi tin rằng điều này sẽ giúp tìm ra nó. Và việc chụp hình có thể không phải là một ý tưởng tồi. Cảm ơn! –

0

Làm thế nào về một đơn giản Perl ngu ngốc tìm và thay thế vào var chứa dữ liệu của bạn ...

foreach $line(@lines) { 
    $line =~ s/&lt;/</gi; 
    $line =~ s/&gt;/>/gi; 
} 
+1

mã hóa chết tiệt trên trang này đã làm hỏng bài đăng của tôi! ;) Tôi sẽ thử lại, nhưng nó hoàn toàn không hoạt động;) $ line = ~ s/<//gi; – onethreefour

+0

Xem ý tôi là gì? Và không có dòng. Đó là tất cả trên một dòng. –

3

Cách tốt nhất là:

  1. Cài đặt HTML::Entities từ CPAN và sử dụng nó để unescape các URI.
  2. Cài đặt HTML::Parser từ CPAN và sử dụng để phân tích cú pháp và xóa các URI sau khi chúng không bị thoát.

Regexes không phải là công cụ phù hợp cho tác vụ này.

+1

Tôi không nghĩ rằng URI unescaping là những gì cô ấy cần.URI unescaping là để thay đổi "% 5D" thành "]" và những thứ khác. Điều có thể hữu ích là hàm decode_entities từ HTML :: Các thực thể để biến "<" thành "<" và cứ thế. – benrifkah

+0

Dữ liệu sẽ không trở thành html được định dạng đúng khi chúng được giải mã. –

+0

Vì vậy, bạn đang tìm cách biến những gì bạn có thành HTML hợp lệ? Nếu vậy thì tiêu đề câu hỏi của bạn hơi gây hiểu lầm. Nó hỏi làm thế nào để loại bỏ HTML. Vui lòng làm rõ. – benrifkah

2

Tôi sẽ không loại bỏ. Đó là xa rác không thể phục hồi.

Đầu tiên áp dụng HTML::Entities::decode_entities có điều kiện (sử dụng sự xuất hiện của < làm ký tự đầu tiên), sau đó để HTML::Tidy::libXML->clean(…, 'UTF-8', 1) tạo lại đánh dấu như dự định. clean trả về toàn bộ tài liệu, nhưng không quan trọng để trích xuất chỉ cần phần tử img cần thiết.

0

Đặt cược tốt nhất của bạn sẽ là thu hồi tất cả các bài viết có trong cơ sở dữ liệu để chúng không bị cắt bớt và bị hỏng. Nếu đây không phải là một tùy chọn thì ...

Dựa trên các ví dụ của bạn ở trên có vẻ như bạn đang loại bỏ mọi thứ theo nội dung văn bản của mỗi bài viết. Trong ví dụ của bạn, nội dung văn bản được theo sau bởi thẻ DIV và một loạt các thẻ IMG có thể có hoặc không bị cắt ngắn và được chuyển đổi thành các thực thể HTML.

Nếu tất cả các hồ sơ của bạn cũng giống như bạn có thể loại bỏ tất cả mọi thứ sau khi nội dung văn bản bằng cách loại bỏ các thẻ div cuối cùng và tất cả những gì sau đó sử dụng perl như thế này:

my $article = magic_to_get_an_article(); 
$article =~ s/<div>.*//s; 
magic_to_store_article($article); 

Nếu hồ sơ của bạn bao gồm mọi thứ phức tạp hơn Hơn thế nữa, bạn nên sử dụng mô-đun phân tích cú pháp HTML và đọc kỹ tài liệu để tìm hiểu cách xử lý HTML không hợp lệ.

0

Với đầu vào mẫu và sản lượng bạn đưa ra ở phần cuối của bài viết của bạn, sau đây sẽ giúp bạn có được kết quả mong muốn:

#!/usr/bin/perl 

use strict; use warnings; 

use HTML::TokeParser::Simple; 
my $parser = HTML::TokeParser::Simple->new(\*DATA); 

if (my $tag = $parser->get_tag('img')) { 
    print $tag->as_is; 
    print $parser->get_text('div'); 
} 

__DATA__ 
<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="post_img" width="80" />Through the first two months of the year, the volume of cargo handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.<div> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/bizj_portland?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:qj6IDK7rITs">&lt;img src=&quot;http://feeds.feedburner.com/~ff/bizj_portland?d=qj6IDK7rITs&quot; 

Output:

<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="po st_img" width="80" />Through the first two months of the year, the volume of car go handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.

Tuy nhiên, tôi bối rối về kích thước và phạm vi của từng đoạn mà bạn phải xử lý.

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