Rodegast
Я сегодня твоё сообщение знакомым показал, так мы вместе над тобой полчаса ржали.
А я вчера, пока ты показывал и ржал там, я вчера в это время делал программу.
Вот эта функция у меня вчера появилась в программе
ctrees_converter_convert_remove_post_align()
{
local ifname="$1"
local ofname="$2"
local xpathreq1 xpathreq2
xpathreq1='./body/div'
xpathreq2='.//div[@class="post-align"]'
echo -n >"$ofname"
cat "$ifname" | python3 -c '
import sys
import lxml.html
doc = lxml.html.fromstring(sys.stdin.read())
print("<html>\n<body>")
outer_nodes = doc.xpath(r"""'"$xpathreq1"'""")
for i in outer_nodes:
inner_nodes = i.xpath(r"""'"$xpathreq2"'""")
for j in inner_nodes:
for k in j:
j.addprevious(k)
j.getparent().remove(j)
text = lxml.html.tostring(i, encoding="unicode", pretty_print=True)
print(text)
print("</body>\n</html>")
' >"$ofname" || return 1
return 0
}
Что это такое? Это, короче, при скачивании страницы обнаруживалось, что в некоторых страницах (не во всех) вокруг ссылок стоял тег выравнивания ссылки по центру. Такая трэшовая мелочь. Казалось бы, нахера это нужно вообще, выравнивать что-то по центру, но вот бывает так, что люди ставят что попало, в том числе и это. Пришлось написать вот этот удалятель этого выравнивания. Это небольшой этап, страница перестраивается многократно, как в цепочке вывода синтаксического дерева - правило за правилом, правило за правилом.
Дальше этот маленький этап участвует вот в этой процедуре конвертаций
topichand_convert_cuttrees()
{
local ifname="$1"
local ofname="$2"
local tfname_s1="${ifname}.converted.stage1.tmp"
local tfname_s2="${ifname}.converted.stage2.tmp"
local tfname_s3="${ifname}.converted.stage3.tmp"
local tfname_s4="${ifname}.converted.stage4.tmp"
echo -n >"$tfname_s1"
if ctrees_converter_convert_remove_post_align "$ifname" "$tfname_s1" && \
ctrees_converter_test_converted_cuttrees "$tfname_s1"; then
:
else
error "Can't convert cut trees to the removed post alignment."
return 1
fi
echo -n >"$tfname_s2"
if ctrees_converter_convert_ahref_to_var "$tfname_s1" "$tfname_s2" && \
ctrees_converter_test_converted_cuttrees "$tfname_s2"; then
:
else
error "Can't convert cut trees from var in tag a to var."
return 1
fi
echo -n >"$tfname_s3"
if ctrees_converter_convert_deep0_to_deep1 "$tfname_s2" "$tfname_s3" && \
ctrees_converter_test_converted_cuttrees "$tfname_s3"; then
:
else
error "Can't convert cut trees from deep 0 to deep 1."
return 1
fi
echo -n >"$tfname_s4"
if ctrees_converter_convert_deepn_to_deep1 "$tfname_s3" "$tfname_s4" && \
ctrees_converter_test_converted_cuttrees "$tfname_s4"; then
:
else
error "Can't convert cut trees from deep N to deep 1."
return 1
fi
rm -f "$tfname_s1" || return 1
rm -f "$tfname_s2" || return 1
rm -f "$tfname_s3" || return 1
mv "$tfname_s4" "$ofname" || return 1
return 0
}
Она появилась не вчера, но вчера я в неё добавил этот один этап конвертации. Тут можно увидеть, что конвертации проводятся разные: у деревьев меняются глубины (слишком мелкие углубляются до единичной глубины, а слишком глубокие обмельчаются до единичной глубины), из ссылок вытаскиваются наружу их атрибуты, так как не все ссылки хранятся одинаково (это в учебных задачках всё всегда одинаковое, а тут реальная задача - зоопарк из ссылок). Естественно, эта вся штука тоже не последняя, а участвует тоже в процедуре выше в качестве маленького кирпичика. После того как ссылки извлечены, для них формируются закачки. Долго описывать не буду, так как до формирования закачек ещё сами ссылки транслируются из эскизов в полные формы (часто ссылки являются не полными, а эскизами только, поэтому их нужно транслировать).
Короче, вот этот кусок я вчера сделал, проверил его, теперь всё работает, всё качает. Естественно, сделал ещё логгер вчера, чтобы сломанные ссылки с кодом 404 писались в лог, а не прерывали серию закачек. Но это было просто сделать, хотя и пришлось всё для логирования написать (функции записи в лог, обёртки сообщений в форму для лог-файла).
Это обёртка для сообщения
logger_wrap_broken_url()
{
awk '{ print "Found broken [" $NF "] at [" $(NF-2) "]"; }'
}
На неё подаётся сообщение, а она возвращает обёрнутое сообщение.
Таким макаром она потом используется
log "$ofname_log" "$(echo "$line" | logger_wrap_broken_url)"
То есть в лог-файл пишется уже не просто сообщение, а обёрнутое сообщение в правильную форму.
Так что два бага я вчера исправил этих (выравнивание ссылок и дохлые ссылки). А сегодня планирую исправлять экстрактор деревьев, потому что в некоторых источниках (не во всех) не извлекает он всё, что там есть, стопорится почему-то на начальном элементе.
Вот кто
чем занимается, тот
то и умеет.
Rodegast
Я сегодня твоё сообщение знакомым показал, так мы вместе над тобой полчаса ржали.
Да, да, я об этом и говорю.