Как удалить символ & только с URL-адресов в файле? - PullRequest
1 голос
/ 30 сентября 2011

У меня есть файл, index.html, содержащий такие данные:

<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-&-fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

Мне нужно убрать символы & из URL, чтобы "/bbq-spareribs-&-sauce-eat-lean-&-fat.html" стало "/bbq-spareribs--sauce-eat-lean--fat.html". Однако я не хочу удалять символ & из частей файла, которые не являются URL-адресами, таких как текст ссылки bbq spareribs & sauce (eat lean & fat).

Как бы я сделал это при стандартной установке Linux? Мне не важно, какой конкретный инструмент / язык используется для достижения результата, пока он работает.

Ответы [ 5 ]

2 голосов
/ 30 сентября 2011

Если вы решили использовать простой инструмент регулярных выражений командной строки и знаете, что ваши URL-адреса хороши, и что в тексте последовательно используются амперсанды, вы можете попробовать что-то вроде:

$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html

Предполагается, что URL не имеет пробелов рядом с амперсандом, и что амперсанды, отсутствующие в URL, всегда окружены пробелами.Так что это ни в коем случае не надежно, но это может быть проще, чем установка Beautiful Soup, если вам это нужно только один раз, и ваш html предсказуем.

2 голосов
/ 30 сентября 2011

Если вы счастливы установить BeautifulSoup , этот простой скрипт на Python может сделать то, что вы хотите:

#!/usr/bin/evn python
import sys
from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(sys.stdin.read())
for a in soup.findAll("a"):
    a["href"] = a["href"].replace("&", "")

print soup

Пример использования:

[me@home]$ cat your.html | python amp_remover.py
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

Предостережение: Поскольку мы регенерируем выходной HTML-код на основе разобранного его представления, форматирование может измениться. Другие возможные изменения включают явное закрытие тегов, если ваша разметка сформирована неправильно.

Возможно, я ошибаюсь, но я подозреваю, что большинство решений, использующих правильный синтаксический анализатор XML / HTML, приведет к аналогичным проблемам. Чтобы сохранить файл таким, какой он есть, и удалить только оскорбляющие символы, вам придется использовать поиск и удаление / замену на основе регулярных выражений. Многие будут советовать не разбирать XML / HTML с помощью регулярных выражений , за исключением действительно тривиальных шаблонов. В вашем случае это может быть правдой, но я еще не убежден.

1 голос
/ 30 сентября 2011

только для полноты ради awk-решения.Он должен быть достаточно стабильным для простых задач.

Файл:

$ cat file
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-&-fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

Вывод:

$ awk 'BEGIN{FS=OFS=">"}{for (i=1;i<=NF;i++){if ($i ~ "a href")gsub(/\&/,"",$i)}}1' file
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

HTH Крис

0 голосов
/ 30 сентября 2011

Вы можете легко использовать javascript для этого:

<head>

<script type="text/javascript">
  document.onload = (function (ev) {
    var links = document.getElementsByTagName('a');
    for (var i = 0; i < links.length; i++) {
      var href = links[i].href.replace(/(&)/, '');
      console.log(links[i]);
    }
  });
</script>

</head>
0 голосов
/ 30 сентября 2011

Один из способов - использовать инструмент / язык с пакетом XML. Этот пакет будет поддерживать легкий доступ к атрибуту href элемента привязки программным способом. Итак, у вас может быть что-то вроде:

aElements = doc.getElement('a')

foreach aElement in aElements {
 string url = a.getHref()
 removeAmpersane ( url )
}

Я уверен, что почти все инструменты уровня языка имеют пакеты для этого. Если вы открыты для такого тяжелого инструмента, как язык, это будет легко для вас. Если вы просто хотите использовать инструменты Linux более низкого уровня, это вне моей компетенции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...