прежде всего: я знаю, что вам не следует использовать RegEx для анализа HTML, потому что снаружи есть много хороших парсеров, таких как BS4 или lxml. Однако, поскольку у меня нет хорошо написанных файлов HTML, я не могу искать тег или что-то еще, чтобы извлечь мой текст HTML.
Мой код частично работает так, как я хочу, но кажется, что он останавливается случайным образом после того, как он соответствует моему регулярному выражению.
import glob
import os
import re
import contextlib
@contextlib.contextmanager
def stdout2file(fname):
import sys
f = open(fname, 'w')
sys.stdout = f
yield
sys.stdout = sys.__stdout__
f.close()
def extractor():
os.chdir(r"F:\Test") # the directory containing html
with stdout2file("Test.txt"):
for file in glob.iglob("*.html"): # iterates over all files in the directory ending in .html
with open(file, encoding="utf8") as f:
contents = f.read()
regex = re.compile(r'The interesting part begins.*?and for sure there is no other reason', re.S)
extract = regex.search(contents)
if re.search(regex, contents) is not None:
print(file.split(os.path.sep)[-1], end="| ")
print(extract)
extractor()
Мой вывод, который я получаю:
Thisismyfirsthtmlfile.html| <_sre.SRE_Match object; span=(75794, 93039), match='The interesting part begins with the notes of Secul>
Таким образом, оно внезапно останавливается внутри слова Secul (обратите внимание, что полное слово будет светским). Попробовав несколько часов с разными решениями, я не могу понять, что я мог пропустить?
Есть идеи по этому поводу?
repr(match)
обрезается, возможно, он соответствует всему, что вы хотели - подделка заключается в том, что он говоритmatch='...
без закрывающей одинарной кавычки перед>
. - person Keith Hall   schedule 28.07.2016if re.search(regex, contents) is not None:
наif extract:
и получите доступ к нужному значению черезextract.group()
. - person Wiktor Stribiżew   schedule 28.07.2016regex.search
является не строка, а объектSRE_Match
. Вы хотитеextract.group(0)
. - person 2ps   schedule 28.07.2016group()
получает доступ к значению совпадения.group(0)
делает то же самое. См. ссылкуre
: Без аргументов,group1
по умолчанию равен нулю (возвращается все совпадение). - person Wiktor Stribiżew   schedule 28.07.2016