繁体   English   中英

如何使用Regex从html文档中提取特定的元信息

[英]How to extract specific meta information from html document using Regex

我需要使用Linux命令从html文档中提取特定的元信息。

例如:具有

<meta content="2017-12-26" name="lastmod"/>

我需要从此元标记中提取2017-12-26

我在“测试”文件夹中设置了一篇文章,我正在反复获取标题和元信息。

我可以获取标题,但不能获取元标题。

我正在尝试的代码

    DOC_FOLDER_PATH=test"/"

        for i in `find $DOC_FOLDER_PATH -type f -name "*.htm*"`
        do
          title_to_get=$(grep "<title>" $i | tail -1)
          title_to_get=$(echo $title_to_get | sed 's/<title>//g' | sed 's/<\/title>//g')
          echo "Title: "$title_to_get

          last_modify_date=$(grep "<meta name='lastmod' $i | tail -1)
          last_modify_date=$(echo $last_modify_date | sed 's/<meta//g' | sed 's/<\">>//g')
          echo 'content'$last_modify_date
        done

我正在获取title_to_get但没有得到last_modify_date 我如何获得last_modify_date

我希望我能解决这个问题。 请帮我。

meta标签中内容和名称的顺序是免费的,但是您的表达式希望( <meta name='lastmod' )lastmod在第一位,而在第二位:

<meta content="2017-12-26" name="lastmod"/>

使用sed,您可以查看lastmod是否存在,然后选择content-content:

echo '<meta content="2017-12-26" name="lastmod"/>'| sed -rn "/<meta .*name=.lastmod./ s/.*content=.([0-9-]+).*/\1/p"
2017-12-26

所以你的代码

last_modify_date=$(grep "<meta name='lastmod' $i | tail -1)
last_modify_date=$(echo $last_modify_date | sed 's/<meta//g' | sed 's/<\">>//g')

可以提高到

 last_modify_date=$(sed -rn "/<meta .*name=.lastmod./ s/.*content=.([0-9-]+).*/\1/p" "$i")

有一些陷阱要提:

也许下次该日期写为2017/12/26。 或者可能是以经典的大陆形式2017年12月26日。 或数不胜数的其他格式之一。

模式“。([[0-9-] +)。*”不可用于单引号或双引号,并且可以完美地工作。 但是您可以对有效字符进行分组,并使用[“']进一步限制错误可能性content=2017-12-26 ,但是我不知道确切如何屏蔽这些字符,因此您必须尝试一下。

换行符注定了:

<meta content="2017-12-26" 
      name="lastmod"/>

还有评论:

<!-- that's not longer valid:
    <meta content="2017-12-26" 
          name="lastmod"/>
-->

但通常只要检查一下结果就足够了,例如“恰好找到一个lastmod日期,并对输入格式的更改做出反应。

大多数html页面不完全符合标准,因此使用xml解析器也可能不起作用。 但是看看xmlstarlet,如何解析xml。 通常,它非常有用,也可能有助于解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM