Narzędzie do wyboru CSS wiersza poleceń

15

Pytanie

Jakie narzędzie (najlepiej w systemie Linux) może wybrać zawartość elementu HTML na podstawie ścieżki CSS?

Przykład

Weźmy na przykład następujący dokument 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>

Jaki program wiersza polecenia (np. Rodzaj „cssgrep”) może wyodrębnić wartości za pomocą selektora CSS? To jest:

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

Program wypisze na standardowym wyjściu następujące informacje:

Tabular Content 1
Tabular Content 2

powiązane linki

Dziękuję Ci!

Dave Jarvis
źródło

Odpowiedzi:

12

Użyj narzędzi W3C do analizowania HTML / XML i ekstrakcji zawartości za pomocą selektorów CSS. Na przykład:

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

Wytworzy pożądaną wydajność:

Tabular Content 1
Tabular Content 2

Zastosowanie linii o długości 240 znaków zapewnia, że ​​elementy o długiej treści nie zostaną podzielone na wiele linii. hxnormalize -xPolecenie tworzy dobrze uformowane dokumentu XML, który może być używany przez hxselect.

Dave Jarvis
źródło
2
Dla MacOS użytkowników brew install html-xml-utils.
anishpatel
7

Rozwiązanie CSS

Polecenie Wyszukiwarka elementów częściowo zrealizuje to zadanie:

Na przykład:

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

To renderuje wynik w formacie JSON, który można wyodrębnić.

Rozwiązanie XML

Moduł XML :: Twig („ sudo apt-get install xml-twig-tools”) zawiera narzędzie o nazwie, xml_grepktóre jest w stanie to zrobić, pod warunkiem, że Twój HTML jest oczywiście dobrze sformułowany.

Przykro mi, ale nie jestem w stanie tego przetestować, ale coś takiego powinno działać:

xml_grep -t '*/div[@class="content"]/table/tbody/tr/td[@class="data"]' file.html
Zero jeden
źródło
2

https://github.com/ericchiang/pup ma oparty na CSS język zapytań, który jest ściśle zgodny z twoim przykładem. W rzeczywistości, po wprowadzeniu danych, następujące polecenie:

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

produkuje:

Tabular Content 1
Tabular Content 2

Trailing text{}usuwa tagi HTML.

Jedną fajną cechą jest to, że nie trzeba podawać pełnej ścieżki, więc ponownie w przykładzie:

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

Jedną z zalet pupjest to, że używa parsowania golang.org/x/net/html do analizowania HTML5.

szczyt
źródło
0

Węzeł może to zrobić za pomocą JQuery i fałszywego DOM.

Zrobiłem dla tego obraz Dockera ( https://hub.docker.com/r/phil294/jquery-jsdom/ ):

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

Drugi argument to kod JavaScript, więc naprawdę możesz zrobić wszystko, co chcesz.

phil294
źródło