วิธีการแยกร้อยไฟล์ซอร์สโค้ด HTML ในเปลือก?


23

ฉันมีไฟล์ซอร์สโค้ด html สองสามร้อย ฉันต้องการแยกเนื้อหาของ<div>องค์ประกอบเฉพาะจากแต่ละไฟล์เหล่านี้ดังนั้นฉันจะเขียนสคริปต์เพื่อวนรอบแต่ละไฟล์ โครงสร้างองค์ประกอบเป็นดังนี้:

<div id='the_div_id'>
  <div id='some_other_div'>
  <h3>Some content</h3>
  </div>
</div>

ใครสามารถแนะนำวิธีการที่ฉันสามารถแยก div the_div_idและองค์ประกอบลูกและเนื้อหาทั้งหมดจากไฟล์โดยใช้บรรทัดคำสั่ง linux?

คำตอบ:


27

แบบ HTML XML-utilsแพคเกจที่มีอยู่ในลินุกซ์รายใหญ่ที่สุดมีจำนวนของเครื่องมือที่มีประโยชน์เมื่อต้องรับมือกับ HTML และเอกสาร XML มีประโยชน์อย่างยิ่งสำหรับกรณีของคุณhxselectซึ่งอ่านจากอินพุตมาตรฐานและแยกองค์ประกอบตามตัวเลือก CSS กรณีการใช้งานของคุณจะมีลักษณะ:

hxselect '#the_div_id' <file

คุณอาจได้รับการร้องเรียนเกี่ยวกับอินพุตที่ไม่ได้เกิดขึ้นอย่างดีทั้งนี้ขึ้นอยู่กับสิ่งที่คุณป้อน การร้องเรียนนี้มีให้มากกว่าข้อผิดพลาดมาตรฐานและสามารถระงับได้ง่ายหากจำเป็น ทางเลือกอื่นสำหรับสิ่งนี้คือการใช้แพ็คเกจ HTML :: PARSER ของ Perl อย่างไรก็ตามฉันจะปล่อยให้คนที่มีทักษะ Perl น้อยสนิมกว่าของฉันเอง


1
hxselectpupเป็นจู้จี้จุกจิกเพิ่มเติมเกี่ยวกับรูปแบบการป้อนกว่า ยกตัวอย่างเช่นฉันInput is not well-formed. (Maybe try normalize?)ไปถึงhxselect จุดที่กำลังpupแยกวิเคราะห์
AB


4

นี่คือสคริปต์ Perl ทดสอบว่าสารสกัดองค์ประกอบและเนื้อหาของตนโดยใช้<div id="the_div_id">HTML::TreeBuilder

#!/usr/bin/env perl
use strict;
use warnings;
use HTML::TreeBuilder;
foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file($file_name);
    for my $subtree ($tree->look_down(_tag => "div", id => "the_div_id")) {
        my $html = $subtree->as_HTML;
        $html =~ s/(?<!\n)\z/\n/;
        print $html;
    }
    $tree = $tree->delete;
}

หากคุณแพ้ Perl, Python HTMLParserมี

PS อย่าลองใช้นิพจน์ทั่วไป .


1
Python มีทั้งdoc.scrapy.org/en/latest/intro/overview.html ;)
AB

1

นี่คือ Ex one-liner ที่จะแยกส่วนนั้นออกจากแต่ละไฟล์:

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

ในการบันทึก / แทนที่ในสถานที่การเปลี่ยนแปลง-cqa!เข้า-cxaและลบ%pส่วน สำหรับการเรียกซ้ำพิจารณาใช้ globbing ( **/*.html)

มันเป็นพื้นสำหรับแต่ละบัฟเฟอร์ / ไฟล์ ( bufdo) มันทำการกระทำดังต่อไปนี้:

  • /pattern - ค้นหารูปแบบ
  • norm - เริ่มต้นการจำลองการกดแป้น Vi ปกติ
    • n - ข้ามไปยังรูปแบบถัดไป (จำเป็นต้องใช้ในโหมด Ex)
    • vatd- ลบส่วนแท็กด้านนอกที่เลือก (ดู: การกระโดดระหว่างแท็ก html )
    • ggdG- ลบบัฟเฟอร์ทั้งหมด (เทียบเท่า:%d)
    • "2p - วางข้อความที่ถูกลบไปก่อนหน้าอีกครั้ง

อาจไม่มีประสิทธิภาพมากและไม่ใช่POSIX ( :bufdo) แต่ควรใช้งานได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.