Chcę odzyskać wszystko, co znajduje się między tymi dwoma znacznikami - <tr> </tr>
- z dokumentu HTML. Teraz nie mam żadnych konkretnych wymagań HTML, które uzasadniałyby parser HTML. Po prostu potrzebuję czegoś, co pasuje <tr>
i </tr>
dostaje wszystko pomiędzy, a może być wiele tr
s. Próbowałem awk, który działa, ale z jakiegoś powodu kończy się to otrzymaniem duplikatów każdego wyodrębnionego wiersza.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
Jak sobie z tym poradzić?
shell-script
text-processing
sed
awk
html
TechJack
źródło
źródło
'/<tr/{p=1}; p; /<\/tr>/{p=0}'
. Opublikuj przykładowe dane wejściowe i oczekiwane dane wyjściowe, jeśli to nie zadziała.awk
działa, alesort -u
Odpowiedzi:
Jeśli chcesz tylko
...
wszystkich<tr>...</tr>
:grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE
W przypadku multilinii wykonaj:
tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE
Sprawdź HTMLFILE jako pierwszy znak „|” (nie zwykle, ale możliwe), a jeśli istnieje, zmień na taki, który nie istnieje.
źródło
echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'
dajefooblabar
. Niebla
powinno tam być?grep -Po '<tr>.*?</tr>'
zwróci jeden wynik w wierszu w przypadku @ NN, ale nie jest przenośny.Masz wymóg, który gwarantuje analizator składni HTML: musisz przeanalizować HTML. HTML :: TreeBuilder Perla , BeautifulSoup Pythona i inne są łatwe w użyciu, łatwiejsze niż pisanie złożonych i kruchych wyrażeń regularnych.
lub
źródło
sed
iawk
nie nadają się do tego zadania, powinieneś raczej użyć odpowiedniego parsera HTML. Na przykładhxselect
z w3.org:źródło
hxselect
wynika, że dobrze sobie radzi z dobrze sformatowanymi dokumentami HTML / XML. Ponadto jest szybszy w użyciu niż Perl, Python i inne. Myślę, żehxselect
to dobry środek między bibliotekami parser ised
/awk
.hxselect
wygląda dobrze, na pewno to odkryje. Dzięki.hxnormalize
zajmuje się niepoprawnie sformatowanymi plikami html / xml.Jeśli
ruby
jest dostępny, możesz wykonać następujące czynnościgdzie
file
jest twój wejściowy plik HTML. Polecenie wykonuje Rubinowy jednowarstwowy. Po pierwsze, czyta wszystkie wiersze zfile
i dołącza je do łańcucha,readlines.join
. Następnie z ciągiem wybiera coś pomiędzy (ale nie włącznie)<tr>
i<\/tr>
to jest jeden znak lub dłużej niezależnie od nowej linii,[/(?<=<tr>).+(?=<\/tr>)/m]
. Następnie usuwa dowolny ciąg<tr>
lub</tr>
ciąggsub(/<\/?tr>/, "")
(jest to konieczne do obsługi zagnieżdżonychtr
znaczników). Wreszcie, drukuje ciąg,puts
.Powiedziałeś, że parser HTML nie jest dla ciebie uzasadniony, ale jest bardzo łatwy w użyciu z Nokogiri
ruby
i sprawia, że polecenie jest prostsze.-rnokogiri
ładuje Nokogiri.Nokogiri::HTML(readlines.join)
czyta wszystkie liniefile
.xpath("//tr")
wybiera każdytr
element imap { |e| e.content }
wybiera zawartość dla każdego elementu, tj. co znajduje się pomiędzy<tr>
i</tr>
.źródło
grep
Aby pobrać treść w obrębie
tr
znacznika w wielu wierszach,xargs
najpierw przepisz ją , na przykład:Aby zwrócić tylko wewnętrzny HTML, użyj:
Sprawdź składnię dla
perlre
rozszerzonych wzorców .Uwaga: w celu zwiększenia wydajności można rozważyć,
ripgrep
która ma podobną składnię.źródło
pup
Przykład użycia
pup
(który korzysta z selektorów CSS ):Aby wydrukować tylko tekst bez użycia tagów:
pup -f myfile.html tr text{}
.Oto kilka przykładów z
curl
:xpup
Przykład użycia
xpup
do analizowania HTML / XML (który obsługuje XPath):źródło
jeśli jest to tylko krótka lista,
<tr>
może to pomóc:Twoje zdrowie
źródło