使用特定標籤從 HTML 檔案中提取多行字串

使用特定標籤從 HTML 檔案中提取多行字串

<span class="style530">我需要提取以標籤開頭並以標籤結尾的字串</span>

我使用 sed 命令但沒有得到想要的結果。下面是範例程式碼:

<strong>
-
<span class="style530">
AA - 
This
is my
First
Heading</span></strong><br>
<span class="style530">
<strong>
*Some
text,*
<strong>
*text*</strong>, 
*text*
<strong>
*text*</strong>: 
<br>
<span class="style530">
<strong>
- This 
is my
Second Heading</strong></span><br>
<span class="style530">
<strong>
*Some
text,*
<strong>
*text*</strong>, 
*Here
is some
text.*
<strong>*text*</strong>: 
*Here is 
some
text*.<br>
<br>
<strong>
-
<span class="style530">
- This is
my Third
Heading</span></strong><br>

輸出應該是這樣的:

 AA - This is my First Heading
 - This is my Second Heading
 - This is my Third Heading

謝謝!

答案1

正規表示式並不能真正完全解析 html。

有一個命令列工具叫希德爾它允許您使用 XPath 或 CSS 選擇器來提取您想要的部分。

像這樣的東西可以滿足您所說的要求:

./xidel test.html --extract '//span[@class="style530"]' --output-format bash

但請注意,這會返回超過您所需的輸出,因為您有一個未關閉的輸出<span class="style530">

答案2

使用 HTMLParser 執行此類操作:

#!/usr/bin/python
# vim: set fileencoding=utf8 :
# (c) fazie

from HTMLParser import HTMLParser
import re
import sys

class MyParser(HTMLParser):
    inside_span = False

    def __init__(self,file):
        HTMLParser.__init__(self)
        f = open(file)
        self.feed(f.read())

    def handle_starttag(self,tag,attrs):
        if tag == 'span':
            for name,value in attrs:
                if name=='class' and value=='style530':
                    self.inside_span=True

    def handle_data(self,data):
        data = data.strip(' \t\r\n')
        if data != "":
            if self.inside_span:
                data = re.sub('\n',' ',data)
                data = re.sub('\s\s+',' ',data)
                print data

    def handle_endtag(self,tag):
        if tag == 'span':
            self.inside_span=False

MyParser(sys.argv[1])

運行:

python myparser.py inputfile.html

答案3

您可以嘗試如下所示的操作。

awk -vRS='<' '
  inside || /^span[^>]*class="style530"/ {
    inside = 1
    if (/^span/)
      n++
    else if (/^\/span>/ && !--n) {
      $0="/span>\n"
      inside=0
    }
    printf "<%s", $0
  }' file.html | sed '/^</ d' | grep -v ">$"

但是,不建議使用 HTML 標頭進行提取。請參見這裡為什麼你不應該解析 HTML 頁面。我建議您使用curlw3m刪除 HTML 標頭,之後解析會變得簡單一些。

答案4

對於從 xml/html 文字中進行簡單提取,我喜歡使用 xidelCSS 選擇器

在此範例中,要選擇屬性包含單字 的所有span元素,我們可以使用classstyle530

xidel --css span.style530 --xml

xidel有很多選擇。問題提供的輸入有點吵雜。在噪音較小的情況下,--xml我們可能會得到類似的結果

<xml>
  <span class="style530">case 1 </span>
  <span class="menu style530 otherclass">case 2 </span>
  ...
</xml>

相關內容