使用<title>标签重命名HTML文件</title>

时间:2013-12-05 01:23:43

标签: python html bash scrape renaming

我是一个相对较新的编程人员。我有一个文件夹,包含子文件夹,其中包含几千个通常命名的html文件,即1006.htm,1007.htm,我想使用文件中的标记重命名。

例如,如果文件1006.htm包含页面标题,我想将其重命名为Page Title.htm。理想情况下,空格会用短划线替换。

我一直在使用bash脚本在shell中工作而没有运气。我怎么做这个,用bash或python?

这是我到目前为止所拥有的......

#!/usr/bin/env bashFILES=/Users/Ben/unzipped/*
for f in $FILES
do
   if [ ${FILES: -4} == ".htm" ]
      then
    awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' $FILES
   fi
done

我也试过

#!/usr/bin/env bash
for f in *.html;
   do
   title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
   mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html   
done

但我从终端得到一个错误,说明如何使用grep ......

3 个答案:

答案 0 :(得分:1)

在bash脚本中使用awk而不是grep,它应该可以工作:

#!/bin/bash   
for f in *.html;
   do
   title=$( awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' "$f" )
   mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html   
done

不要忘记在第一行更改你的bash环境;)

编辑所有修改的完整答案

#!/bin/bash
for f in `find . -type f | grep \.html`
   do
   title=$( awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' "$f" )
   mv -i "$f" "${title//[ ]/-}".html
done

答案 1 :(得分:0)

您希望使用HTML解析器(如lxml.html)来解析HTML文件。一旦你有了这个,检索标题标签是一行(可能是page.get_element_by_id("title").text_content())。

将其翻译成文件名并重命名文档应该是微不足道的。

答案 2 :(得分:0)

这是我刚写的一个python脚本:

import os
import re

from lxml import etree


class MyClass(object):
    def __init__(self, dirname=''):
        self.dirname   = dirname
        self.exp_title = "<title>(.*)</title>"
        self.re_title  = re.compile(self.exp_title)

    def rename(self):
        for afile in os.listdir(self.dirname):
            if os.path.isfile(afile):
                originfile = os.path.join(self.dirname, afile)
                with open(originfile, 'rb') as fp:
                    contents = fp.read()
                try:
                    html  = etree.HTML(contents)
                    title = html.xpath("//title")[0].text
                except Exception as e:
                    try:
                        title = self.re_title.findall(contents)[0]
                    except Exception:
                        title = ''

                if title:
                    newfile = os.path.join(self.dirname, title)
                    os.rename(originfile, newfile)


>>> test = MyClass('/path/to/your/dir')
>>> test.rename()