Рейтинг:2

извлечение имен файлов из элементов href

флаг in

У меня есть документ, содержащий список файлов. Каков простой способ извлечь имена файлов внутри элемента href (без кавычек) и скопировать их в список, разделенный разрывами строк?

<manifest>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
<item id="css" href="845214570.css" media-type="text/css"/>
<item id="cover-image" href="845214570.jpg" media-type="image/jpeg"/>
<item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" properties="nav"/>
<item id="cover" href="cover.xhtml" media-type="application/xhtml+xml"/>
<item id="author" href="author.xhtml" media-type="application/xhtml+xml"/>
<item id="title" href="title.xhtml" media-type="application/xhtml+xml"/>
<item id="copy" href="copy.xhtml" media-type="application/xhtml+xml"/>
<item id="contents" href="contents.xhtml" media-type="application/xhtml+xml"/>
<item id="preface" href="preface.xhtml" media-type="application/xhtml+xml"/>
<item id="ack" href="ack.xhtml" media-type="application/xhtml+xml"/>
<item id="ch1" href="ch1.xhtml" media-type="application/xhtml+xml"/>
<item id="ch2" href="ch2.xhtml" media-type="application/xhtml+xml"/>
<item id="ch3" href="ch3.xhtml" media-type="application/xhtml+xml"/>
<item id="ch4" href="ch4.xhtml" media-type="application/xhtml+xml"/>
<item id="ch5" href="ch5.xhtml" media-type="application/xhtml+xml"/>
<item id="ch6" href="ch6.xhtml" media-type="application/xhtml+xml"/>
<item id="ch7" href="ch7.xhtml" media-type="application/xhtml+xml"/>
<item id="ch8" href="ch8.xhtml" media-type="application/xhtml+xml"/>
<item id="ch9" href="ch9.xhtml" media-type="application/xhtml+xml"/>
<item id="ch10" href="ch10.xhtml" media-type="application/xhtml+xml"/>
<item id="ch11" href="ch11.xhtml" media-type="application/xhtml+xml"/>
<item id="app" href="app.xhtml" media-type="application/xhtml+xml"/>
<item id="appb" href="appb.xhtml" media-type="application/xhtml+xml"/>
<item id="appc" href="appc.xhtml" media-type="application/xhtml+xml"/>
<item id="index" href="index.xhtml" media-type="application/xhtml+xml"/>
<item id="img-f0019-01" href="f0019-01.jpg" media-type="image/jpeg"/>
<item id="img-f0027-01" href="f0027-01.jpg" media-type="image/jpeg"/>
<item id="img-f0029-01" href="f0029-01.jpg" media-type="image/jpeg"/>
</manifest>
Рейтинг:6
флаг in

Для файла XML с этим простым форматом вы можете использовать grep:

grep -Po 'href="\K[^"]*' файл.xml > имена файлов.lst
  • Используйте регулярное выражение, совместимое с Perl (PCRE)
  • Вывести только совпадение
  • Держите все, пока здесь вне матча
  • [^"]* Совпадение с любым количеством символов (*) это не (^) двойная кавычка (").

Однако, если у вас более сложный XML, вы можете и должны предпочесть правильный XML парсер, например xmlstarlet:

xmlstarlet sel -t -v '//item/@href' -n файл.xml > имена файлов.lst

Это можно установить через

sudo apt установить xmlstarlet

Поскольку вы отметили свой вопрос питон, конечно, вы также можете использовать это:

#!/usr/bin/env python3
импортировать xml.etree.ElementTree как ET
корень = ET.parse('файл.xml')
для элемента в root.findall('.//item'):
    печать (элемент. атрибут ['href'])
minto avatar
флаг in
Греп работает нормально. Спасибо.
minto avatar
флаг in
для python (у меня python 2.x) отображается ошибка `./extract.py ./extract.py:4: FutureWarning: этот поиск не работает в 1.3 и более ранних версиях и будет исправлен в будущей версии. Если вы полагаетесь на текущее поведение, измените его на './/item' для элемента в root.findall('//item'):` Я изменил, но вывод не напечатан.
pLumo avatar
флаг in
Я изменил это, чтобы быть совместимым со старой версией Python.
флаг hr
Другой вариант, который я обнаружил недавно, — это `xq` из [yq suite] (https://github.com/kislyuk/yq), который позволяет выполнять JSON-подобные запросы к документам xml, например. `xq -r '.manifest.item[] | ."@href"' файл.xml`
bac0n avatar
флаг cn
...или `hxselect -s \n -c 'item::attr(href)'

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.