10

Вопрос

Какой инструмент (предпочтительно для Linux) может выбрать содержимое элемента HTML на основе его пути CSS?

пример

Например, рассмотрим следующий HTML-документ:

<html>
<body>
  <div class="header">
  <h1>Header</h1>
  </div>
  <div class="content">
    <table>
      <tbody>
      <tr><td class="data">Tabular Content 1</td></tr>
      <tr><td class="data">Tabular Content 2</td></tr>
      </tbody>
    </table>
  </div>
  <div class="footer">
  <p>Footer</p>
  </div>
</body>
</html>

Какая программа командной строки (например, своего рода "cssgrep") может извлекать значения с помощью селектора CSS? То есть:

cssgrep page.html "body > div.content > table > tbody > tr > td.data"

Программа напишет следующее в стандартный вывод:

Tabular Content 1
Tabular Content 2

Ссылки по теме

Спасибо!

4 ответа4

7

Решение CSS

Команда Element Finder частично выполнит эту задачу:

Например:

elfinder -j -s td.data -x "html"

Это отображает результат в формате JSON, который можно извлечь.

Решение XML

Модуль XML::Twigsudo apt-get install xml-twig-tools ») поставляется с инструментом под названием xml_grep который способен сделать это, конечно, при условии, что ваш HTML правильно сформирован.

Извините, я не могу проверить это в данный момент, но что-то вроде этого должно работать:

xml_grep -t '*/div[@class="content"]/table/tbody/tr/td[@class="data"]' file.html
6

Используйте инструменты W3C для разбора HTML/XML и извлечения контента с помощью селекторов CSS. Например:

hxnormalize -l 240 -x filename.html | hxselect -s '\n' -c "td.data"

Будет выдавать желаемый результат:

Tabular Content 1
Tabular Content 2

Использование строки длиной 240 символов гарантирует, что элементы с длинным содержимым не будут разбиты на несколько строк. Команда hxnormalize -x создает правильно сформированный документ XML, который может использоваться hxselect .

1

https://github.com/ericchiang/pup имеет язык запросов на основе CSS, который соответствует вашему примеру. На самом деле, с вашим вводом, следующая команда:

pup "body > div.content > table > tbody > tr > td.data text{}"

производит:

Tabular Content 1
Tabular Content 2

Задний text{} удаляет теги HTML.

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

$ pup 'td.data text{}' < input.html
Tabular Content 1
Tabular Content 2

Одним из преимуществ pup является то, что он использует пакет golang.org/x/net/html для анализа HTML5.

0

Node может сделать это с помощью JQuery и поддельного DOM.

Я сделал для этого образ Docker (https://hub.docker.com/r/phil294/jquery-jsdom/):

docker run --rm -it phil294/jquery-jsdom "$(<page.html)" '$("body > div.content > table > tbody > tr > td.data").text()'

Второй аргумент - это код JavaScript, так что вы можете делать все, что захотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .