سؤال

أحاول استخدام XPath لاستخراج بعض علامات HTML والبيانات ولديها أحتاج إلى استخدامها XML::LibXML وحدة.

حاولت تثبيتها من قذيفة CPAN لكنها لا تقوم بتثبيتها.

اتبعت التعليمات من موقع CPAN حول التثبيت، ونحن بحاجة إلى تثبيت libxml2, iconv و zlib الأغلفة قبل التثبيت XML::LibXML ولم ينجح ذلك.

أيضا، إذا كان هناك أي وحدة نمطية أكثر بساطة تحصل على مهمتي، واسمحوا لي أن أعرف.

المهمة في يدك:

أنا أبحث عن معين <dd> علامة على صفحة HTML كبيرة حقا (حوالي 5000 - 10000) <dd> و <dt> العلامات. لذلك، أنا أكتب النصي الذي يطابق المحتوى في الداخل <dd> علامة وتجلب المحتوى داخل المقابلة (التالي) <dt> بطاقة شعار.

أتمنى لو كنت أكثر وضوحا قليلا. أي مساعدة يحظى بتقدير كبير.

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم ActiveState Perl، يجب عليك إضافة المستودعات المدرجة في حزم ActivePerl 10xx Win32 PPM ل ppm ثم استخدم

PPM تثبيت XML :: LIBXML

تحاول تحليل HTML ك XML عموما ليست مهمة ممتعة. أظن أتش تي أم أل :: Tokeparser. هو أكثر ملاءمة للمهمة.

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TokeParser;

my $p = HTML::TokeParser->new(\*DATA);

my @definitions;

while ( my $dl_tag = $p->get_tag('dl') ) {
    while ( my $dt_tag = $p->get_tag('dt') ) {
        my $term = $p->get_trimmed_text('/dt');
        my $dd_tag = $p->get_tag('dd');
        my $defn = $p->get_trimmed_text('/dd');
        push @definitions, [$term, $defn];
    }
}

use Data::Dumper;
print Dumper \@definitions;

__DATA__
<dl>
<dt>One</dt>
<dd>1</dd>
<dt>Two</dt>
<dd>2</dd>
</dl>

انتاج:

$ var1 = [["واحد"، "1"]، ["الثاني"، "2"]؛

نصائح أخرى

إذا كنت تريد فقط استعلامات XPath، فقد كتبت نصا يوم أمس يستخدم XML :: XPath :: XMLPARSER للقيام باستعلامات XPATH على ملف XML.

لقد اختبرت ذلك مع كل من تثبيت بيرل النشطة ومع الفراولة بيرل على ويندوز.

لا أتذكر الاضطرار إلى الذهاب إلى CPAN لتثبيت أي وحدات (على الرغم من أنني قد أكون في وقت سابق نسيت القيام بذلك :))، لذلك ربما يمكنك استخدام وحدة XML :: XPath بدلا من ذلك؟

هنا هي العينة من الوثائق

use XML::XPath;
use XML::XPath::XMLParser;

my $xp = XML::XPath->new(filename => 'test.xhtml');

my $nodeset = $xp->find('/html/body/p'); # find all paragraphs

foreach my $node ($nodeset->get_nodelist) {
    print "FOUND\n\n", 
        XML::XPath::XMLParser::as_string($node),
        "\n\n";
}

على افتراض أنك تستخدم النشطة بيرل، يمكنك الحصول عليها XML :: LIBXML. العمل على ما يرام. يمكنك الحصول على XML :: LIBXML من موقع راندي كوب وتحصل على libxslt / libxml، إلخ zlatkovic.com.

أنا فقط قم بتثبيت LIBXML أولا ثم استخدم PPM لتثبيت XML :: LIBXML. يعمل بشكل جيد فقط.

إذا كنت تستخدم الفراولة بيرل, ، يجب أن تعمل CPAN من أجلك كما libxml2، إلخ هي جزء من توزيع الفراولة بيرل أعتقد.

انظر أيضا مشاركتي في الخيط كيف يمكنني تثبيت XML :: LIBXML ل ActivePerl؟.

يناقش بعض المشكلات / الحلول التي واجهتها تثبيت XML-LIBXML باستخدام PPM.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top