Bagaimana cara menghapus teks yang tidak diinginkan dari string?

1

Saya punya applescript yang mengembalikan judul dari sebuah situs web, satu-satunya masalah adalah, itu juga mengandung banyak HTML yang tidak diinginkan (saya pikir?). Sebagian besar waktu, saya bisa mengatasinya dengan menghapus karakter umum menggunakan kode berikut.

on CharacterRemover(inputString, ReplaceChar)

set TID to AppleScript's text item delimiters
set AppleScript's text item delimiters to ReplaceChar
set pieces to text items of inputString -- break string apart at commas
set AppleScript's text item delimiters to "" -- or whatever replaces the comma
set inputString to pieces as text -- put string back together using whatever
set AppleScript's text item delimiters to TID

return inputString

end CharacterRemover

set FirstTitle to "<!-- react-text: 45 -->“<!-- /react-text --><!-- 
react-text: 46 -->Megan Fox<!-- /react-text --><!-- react-text: 47 -- 
>”<!-- /react-text -->" --the format of the returned title
set FirstTitle to CharacterRemover(FirstTitle, "-")
set FirstTitle to CharacterRemover(FirstTitle, ">")
set FirstTitle to CharacterRemover(FirstTitle, "<")
set FirstTitle to CharacterRemover(FirstTitle, "!")
set FirstTitle to CharacterRemover(FirstTitle, "/")
set FirstTitle to CharacterRemover(FirstTitle, "reacttext")
set FirstTitle to CharacterRemover(FirstTitle, ":")
set FirstTitle to CharacterRemover(FirstTitle, "”")
set FirstTitle to CharacterRemover(FirstTitle, "“")

set z to 0

repeat 10 times
set FirstTitle to CharacterRemover(FirstTitle, z)
set z to z + 1
end repeat

set FirstTitle to CharacterRemover(FirstTitle, " ")

display dialog FirstTitle

Namun, karena kode ini menghilangkan angka, ketika saya mendapatkan judul seperti

<!-- react-text: 477 --><!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 --><!-- /react-text -->

kembali sebagai "iPhone", bukan "iPhone 8"

sunting: di situs web "higherorlower.com" Saya menggunakan javascript "document.getElementsByClassName" untuk mengembalikan judul jumlah pencarian yang diberikan

ada ide untuk mengatasi ini?

cjeccjec
sumber

Jawaban:

3

Saya akan menyarankan Anda melihat (dan, jika Anda mau, umpan balik tentang) metode yang Anda gunakan untuk mengambil informasi dari situs web, karena opsi terbaik dan paling dapat diandalkan adalah menggunakan metode yang berbeda sehingga Anda tidak perlu harus berurusan dengan ReactJSkomentar sama sekali.

Jika Anda memasukkan bagian dari AppleScript Anda bersama yang lain, itu mungkin merupakan kesempatan untuk menyelesaikan masalah Anda di sumbernya.

Meskipun demikian, inilah salah satu metode untuk menghapus tag dari string teks Anda, meskipun bukan satu-satunya metode, juga bukan metode yang paling anggun atau efisien. Tapi itu cukup bersih dan, menganggap tag semua ReactJStag komentar sederhana , itu akan melakukan pekerjaan yang dapat diandalkan.

    set string1 to "<!-- react-text: 45 -->“<!-- /react-text --><!-- \nreact-text: 46 -->Megan Fox<!-- /react-text --><!-- react-text: 47 -- \n>”<!-- /react-text -->"

    set string2 to "<!-- react-text: 477 -->“<!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 -->”<!-- /react-text -->"

    stripTags from string1 --> "“Megan Fox”"
    stripTags from string2 --> "“iPhone 8”"
    --------------------------------------------------------------------------------
    to stripTags from s as text
        local s

        # Eliminate linebreaks and join to form one line of text
        set the text item delimiters to {null, linefeed, return}
        set s to the text items of s as text

        # Use bash to isolate all the various tags within the string
        # Note: not suitable for tags with irregular content, such as
        # any that unexpectedly contain '<' or '>' as part of their
        # text content.  However, that shouldn''t be an issue here.
        do shell script "egrep -io -e '<[^>]+>' <<<" & the quoted form of s

        # Use the tags as a basis for elimination using AS's TIDs
        set the text item delimiters to {null} & paragraphs of the result
        set s to the text items of s as text

        return s
    end stripTags

string1adalah salinan variabel Anda FirstTitle, termasuk jeda baris yang dikandungnya (saya tidak yakin apakah ini sengaja atau merupakan artefak ketika Anda menyalin skrip Anda ke browser); ada atau tidaknya mereka tidak mempengaruhi kemanjuran naskah saya, tetapi hanya mengharuskan dua baris di awal stripTagspawang yang menghilangkannya.

string2 adalah teks yang Anda berikan di bagian bawah pertanyaan Anda.

Saya telah menunjukkan output dari masing-masing pemrosesan berikut ini. Saya mempertahankan tanda kutip ganda yang disebut "pintar" yang merupakan bagian dari string dan berbohong dengan tag; Saya memang melihat bahwa Anda telah memilih untuk menghilangkannya, tetapi kehadiran mereka di sini — hanya untuk tujuan demonstrasi — adalah jaminan visual yang bagus bahwa skrip hanya menargetkan tag, dan menyimpan teks di antaranya. Saya harap Anda tidak keberatan jika saya meninggalkan kutipan cerdas itu untuk Anda atasi sesuai keinginan.

Beri tahu saya jika Anda memiliki pertanyaan.

TAMBAH 2018-05-12:

@cjeccjec Terima kasih telah memperbarui informasi situs web dengan URL yang benar. Kiat untuk waktu berikutnya: sertakan kode yang Anda gunakan untuk mendapatkan judul. Akan lebih mudah bagi orang untuk membantu Anda dan itu akan menarik lebih banyak bantuan juga.

Untungnya, masalah ini tampaknya cukup jelas. Menggunakan getElementsByClassName()adalah ide yang bagus, dan Anda bahkan berhasil mengidentifikasi nama kelas yang menarik term-keyword__keyword,. Sudah selesai dilakukan dengan baik.

Elemen yang ditugaskan ke classname itu adalah <p>elemen. Mereka memang memiliki titleproperti, tetapi itu kosong, jadi saya curiga itu bukan apa yang Anda gunakan atau apa yang Anda cari sama sekali.

Mereka juga memiliki properti yang disebut textContent, yang, seperti yang disarankan, mengembalikan teks yang terkandung dalam elemen, yaitu label item yang dibandingkan dalam game ini. Saya percaya itu yang Anda cari, dan sepenuhnya gratis dari ReactJStag.

Kode ini mengembalikan array textContentproperti dari tiga p.term-keyword__keywordtag yang dimuat di situs pada satu waktu: dua saat ini terlihat dan sedang dimainkan sedang dibandingkan; dan satu layar di sebelah kanan menunggu untuk menggulir tampilan untuk perbandingan selanjutnya.

    Array.from(document
              .getElementsByClassName('term-keyword__keyword'),
               e=>e.textContent.slice(1,-1)
              );

Saya juga mengambil kebebasan memotong kutipan dari awal dan akhir teks.

Masukkan ini ke dalam AppleScript seperti:

    tell application "Safari" to set labels ¬
        to do JavaScript "Array.from(document" & ¬
        ".getElementsByClassName('term-keyword__keyword')," & ¬
        "e=>e.textContent.slice(1,-1));" in the front document

    --> {"Microsoft Word", "Moobs", "Malaysia"}

    item 2 of labels --> "Moobs"

Itulah hasil yang saya dapatkan saat bermain game. Saya mencoba menebak apakah "Microsoft Word" atau "Moobs" memiliki lebih banyak pencarian internet, yang saya dapatkan dengan benar; kemudian "Malaysia" menggulir ke tampilan seperti yang sudah saya tahu.

Dengan menggunakan metode ini, Anda tidak perlu menghapus ReactJStag apa pun , maupun tanda kutip.

CJK
sumber
di situs web "higherorlower.com" Saya menggunakan javascript "document.getElementsByClassName" untuk mengembalikan judul jumlah pencarian yang diberikan
cjeccjec
@cjeccjec Maaf atas keterlambatan saya dalam membalas — sudah tidak sehat. Situs web higherorlower.commengembalikan Error 403(Terlarang). Apakah masih bekerja untuk Anda; apakah saya memerlukan otorisasi khusus untuk mengaksesnya?
CJK
di mana nama kelasnya adalah "term-keyword__keyword" (0) menggunakan javascript saya masih bisa mendapatkan judul. Permainan harus dimulai dengan klasik. Saya menyadari bahwa situs web yang sebenarnya adalah higherlowergame.com
cjeccjec
1
@cjeccjec Yup, situs web itu berfungsi. Saya telah memperbarui jawaban saya dengan solusi untuk masalah Anda. Ternyata, Anda tidak perlu repot-repot melepaskan kode HTML yang tidak diinginkan sama sekali. Menang!
CJK
1

Ini cukup mudah dipecahkan dengan menggunakan NSString dalam kerangka Foundation , yang mencakup dukungan untuk ekspresi reguler.

use framework "Foundation"
set sample1 to "<!-- react-text: 477 -->“<!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 -->”<!-- /react-text -->"
log sample1
log removeHTML(sample1)

on removeHTML(instr)
    set nStr to current application's NSString's stringWithString:instr
    return (nStr's stringByReplacingOccurrencesOfString:"<[^>]+>" withString:"" 
        options:(current application's NSRegularExpressionSearch) 
        range:{0, nStr's |length|()}) as text
end removeHTML

Output:

<!-- react-text: 477 --><!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 --><!-- /react-text -->
”iPhone 8”
boris42
sumber
@ CJK Tentu saja mengembalikan "iPhone 8" sebagaimana mestinya. Saya membuat kesalahan ketik / tempel dari log Editor Skrip ...
boris42