Переименование файлов HTML с использованием тегов ‹title›

Я относительно новичок в программировании. У меня есть папка с подпапками, которые содержат несколько тысяч html-файлов с общими именами, например 1006.htm, 1007.htm, которые я хотел бы переименовать, используя тег из файла.

Например, если файл 1006.htm содержит Заголовок страницы, я хотел бы переименовать его Заголовок страницы.htm. В идеале пробелы заменяются тире.

Я безуспешно работал в оболочке с bash-скриптом. Как мне это сделать с помощью 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...


person user3068211    schedule 05.12.2013    source источник
comment
Итак, что вы сделали до сих пор. Я думаю, что решение типа grep может работать   -  person Scary Wombat    schedule 05.12.2013


Ответы (3)


используйте awk вместо grep в вашем скрипте bash, и он должен работать:

#!/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
person Fab V.    schedule 05.12.2013
comment
Это прекрасно работает - есть идеи, как применить это ко всем файлам в подкаталогах? и добавить '-' там, где есть пробелы в теге ‹title›? - person user3068211; 05.12.2013
comment
найти . -тип f | grep \.html, чтобы получить все файлы html - person Fab V.; 05.12.2013
comment
а для замены '-' я предлагаю вам сделать: mv -i $f ${title//[ ]/-}.html - person Fab V.; 05.12.2013
comment
find . -type f | grep \.htm распечатывает все файлы в каталоге в терминале, но как мне передать это остальной части скрипта? - person user3068211; 05.12.2013
comment
Я отредактировал свой ответ с полным сценарием! В следующий раз, пожалуйста, предоставьте все детали в начале. Спасибо! - person Fab V.; 05.12.2013
comment
Спасибо Фаб! Вы огромная помощь. - person user3068211; 06.12.2013

Вы хотите использовать анализатор HTML (например, lxml.html) для анализа файлов HTML. . Как только вы это сделаете, получение тега title займет одну строку (вероятно, page.get_element_by_id("title").text_content()).

Преобразование этого в имя файла и переименование документа должно быть тривиальным.

person Max Noel    schedule 05.12.2013

Вот скрипт 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()
person flyer    schedule 05.12.2013