2017-09-16 1 views
1

Das ist eine ziemlich nervige, aber viel einfachere Aufgabe. dies Gemäß dieser guide schrieb ich:Entkernen Sie das kaufmännische Und (&) via XMLStarlet - Bugging &

#!/bin/bash 

content=$(wget "https://example.com/" -O -) 
ampersand=$(echo '\&') 

xmllint --html --xpath '//*[@id="table"]/tbody' - <<<"$content" 2>/dev/null | 
    xmlstarlet sel -t \ 
     -m "/tbody/tr/td" \ 
      -o "https://example.com" \ 
      -v "a//@href" \ 
      -o "/?A=1" \ 
      -o "$ampersand" \ 
      -o "B=2" -n \ 

ich erfolgreich jede Verbindung aus der Tabelle extrahieren und alles wird richtig verkettet, jedoch anstelle der Wiedergabe der Ampersand als & ich erhalten diese am Ende jeder Link:

https://example.com/hello-world/?A=1\&amp;B=2 

Aber eigentlich ich war auf der Suche nach so etwas wie:

https://example.com/hello-world/?A=1&B=2 

Die Idee ist es, das Zeichen mit einem Backslash \& zu entkommen, so dass es ignoriert wird. Anfangs habe ich versucht, es direkt in -o "\&" \ anstelle von -o "$ampersand" \ zu platzieren und ampersand=$(echo '\&') in diesem Fall zu entfernen. Immer noch das gleiche Ergebnis.

Im Wesentlichen durch den umgekehrten Schrägstrich zu entfernen gibt sie noch:

https://example.com/hello-world/?A=1&amp;B=2 

Nur, dass die \ hinter den &amp; entfernt wird.

Warum?

Ich bin sicher, es ist etwas Grundlegendes, das fehlt.

+0

ist die Qualität Ihrer Antworten zu verbessern, sollten Sie einige Abtastwerteingang zusammen mit dem gewünschten Ausgang umfassen, so können wir mögliche Lösungen testen. –

+0

Sie haben Recht. Ich werde deinem Rat folgen! Prost @TomFenech –

Antwort

1

Leider kann ich Ihr Ergebnis nicht reproduzieren, aber warum nicht ersetzen? Filtern Sie einfach Ihre Ergebnisse durch

sed 's/\\&amp;/\&/g' 

fügen Sie es zu Ihrer Rohrleitung hinzu. Es sollte alle & Amp ersetzen; zu &.

+0

Hallo @vollitwr Ich denke, du solltest '**' am Ende entfernen, sonst denke ich, dass das "Sed 's/\\ &/\ &/g'' hier am besten funktioniert. –

+0

Entschuldigung, es ist behoben. Es waren Überbleibsel der Stackoverflow-Formatierung. – vollitwr

1

Wie Sie bereits gesehen haben, ist Backslash-Escaping hier nicht die Lösung. Ich kann von zwei möglichen Optionen denken:

die hrefs Extrakt (wahrscheinlich nicht brauchen beidexmllint und xmlstarlet tun dies mit zu), dann benutzen Sie einfach eine Standard-Textverarbeitungswerkzeug wie sed den Start hinzufügen und das Ende:

sed 's,^,https://example.com/,; s,$,/?A=1\&B=2,' 

Alternativ Rohr die Ausgabe von dem, was hast du zur Zeit kam zu xmlstarlet unesc, die &amp; in & ändern wird.

+0

Hi @TomFenech Rohrleitung 'xmlstarlet unesc' arbeitete für mich. Vielen Dank! –

1

&amp; ist der richtige Weg, & in einem XML-Dokument zu drucken, aber da Sie nur eine einfache URL möchten, sollte Ihre Ausgabe nicht XML sein. Daher müssen Sie in den Textmodus wechseln, indem Sie --text oder -T an den Befehl sel übergeben.

Ihre Beispieleingabe funktioniert nicht ganz, da example.com keine table Elemente hat, aber hier ist ein funktionierendes Beispiel, das stattdessen Links von Elementen erstellt.

content=$(wget 'https://example.com/' -O -) 
xmlstarlet fo --html <<<"$content" | 
    xmlstarlet sel -T -t \ 
     -m '//p[a]' \ 
      --if 'not(starts-with(a//@href,"http"))' \ 
       -o 'https://example.com/' \ 
      --break \ 
      -v 'a//@href' \ 
      -o '/?A=1' \ 
      -o '&' \ 
      -o 'B=2' -n 

Der Ausgang

http://www.iana.org/domains/example/?A=1&B=2 
+0

Hi @npostavs, es vereinfacht mein Skript wirklich gut. Das '-if' ist in meinem Fall überflüssig, da bei allen zu extrahierenden Links die Basis-URL fehlt. Sonst funktioniert es großartig. Prost! –

Verwandte Themen