Я относительно новичок в программировании. У меня есть папка с подпапками, в которой содержится несколько тысяч html файлов, которые в общем названы, то есть 1006.htm, 1007.htm, которые я хотел бы переименовать, используя тег из файла.
Например, если файл 1006.htm содержит название страницы, я хотел бы переименовать его. Page Title.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
Но я получаю сообщение об ошибке с терминала exlaing, как использовать grep...
используйте 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 env на первой строке;)
EDIT полный ответ со всеми изменениями
#!/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
Вот сценарий 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()
Вы хотите использовать парсер HTML (например, lxml.html
) для анализа ваших файлов HTML. Как только вы получите это, получение тега заголовка - это одна строка (вероятно, page.get_element_by_id("title").text_content()
).
Перевод этого имени файла и переименование документа должен быть тривиальным.