提取網頁的一部分親愛的社區成員,
我正在嘗試從又長又亂的字串中提取一段文字。 我想提取 YouTube 影片的描述部分。
例如,在這個影片中: https://youtu.be/yvoddqG-lm8我想只提取描述部分:
「Mia Stephens 展示如何在 JMP 中執行基本統計分析。 她介紹如何使用分佈一次分析一個變數的資料。 使用 Fit Y by X 進行涉及兩個變數的分析,使用擬合模型進行涉及兩個以上變數的分析。 她還審查了用於匯總和繪製數據圖表的工具。 該視頻的第三部分是學習使用 JMP 的基礎知識的系列視頻,以充分利用 JMP 30 天免費試用版或新的 JMP 許可證。 JMP 學術大使 Mia Stephens 示範如何瀏覽 JMP 選單和資料表、將資料匯入 JMP、匯總資料並繪製圖表以及執行基本統計分析。 該演示使用將於 9 月推出的 JMP 11。 查看 JMP 11 中的新功能: http://www.jmp.com/software/preview-j...”
我設法使用以下命令將整個網頁腳本作為字串獲取:
page = open (https://youtu.be/yvoddqG-lm8);
我注意到我正在查看的描述部分在頁面中出現了幾次。 特別是在這些條款之後:
\\!"描述\\!":{\\!"運行\\!":[{\\!"文本\\!":\\!"
或: \\!"description\\!":{\\!"simpleText\\!":\\!"
有什麼建議 ?
我提取整個頁面程式碼的方向是否正確,或者有沒有辦法直接提取我正在尋找的部分?
謝謝。
回覆:提取網頁的一部分-缺少某些內容@LNitz - YouTube API可能有幫助。 此頁面上的資訊可能與顯示的不完全一樣,因為下載的 YouTube HTML 似乎在過去一年左右發生了變化。
我認為您想要建立一個 JMP 資料表,新增所需的列,然後使用 for 迴圈或列公式來填入表中的行。
回覆:提取網頁的一部分我已經嘗試過這個簡潔的程式並且運行它沒有錯誤。但是,我不知道如何嵌入它,以便將我恢復的文字發佈到 JMP 檔案中。當我執行此文件或指向不同網頁的稍微不同的版本時,我定義的文件(稱為 Page)不會從網頁接收任何資料。
這是我的程式碼(包括原始原始檔作為註解):
/*page = open ("https://youtu.be/yvoddqG-lm8");;*/
page = Open( "https://www.theatlantic.com/ideas/archive/2021/07/republicans-anti-history-marjorie-taylor-greene/619403" );
division = Regex( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
回覆:提取網頁的一部分如果您不介意在工具箱中新增工具(並且希望避免使用正規表示式解析 HTML 的複雜性),您可以利用 JMP 的 Python Bridge(這裡是幫助程式將其與 Anaconda 的發行版一起使用)並使用為處理 HTML 解析而建置的套件,例如美麗的湯。
這個包有很多文件和例子因此,一旦您弄清楚如何在 JMP 和 Python 之間傳輸資料(詳細信息這裡)您可以專注於要提取的內容,然後在 JMP 中對其進行處理。
回覆:提取網頁的一部分偉大的!
對於任何正在閱讀的人:在頂部, @馬克貝利介紹了不情願的?操作員:
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
我將其回收為.*?但這是相同的想法並且非常重要。 這?下列的+或者*使+或者*不情願的代替貪婪的。 + 表示一個或多個和*方法零個或多個其左側的任何內容......在本例中是一個句點。 時期匹配任何東西。 貪婪的意味著*或者+將重複。 (匹配任何字元)一直到字串末尾,大約 50,000 個字元。 在上面的例子中,正規表示式仍然需要找到” > 。 它無法在文字末尾匹配,因此正則表達式開始釋放貪婪獲取的字符,一次一個,測試” > 。很有可能會發現” >屬於字串末尾附近的其他一些帶引號的字串,並最終接受您想要的文字以及一堆額外的文字。
在裡面不情願的版本, .*?最初匹配零個字符,但沒有找到” > 。 所以正規表示式推動.*?前進一個字元並再次測試。 不情願的會找到下一個” > ,而不是靠近文字末尾的一個。
往往貪婪行為和不情願行為會得到相同的答案,而且貪婪的速度更快。 但在這個例子中,答案是不同的,不情願的速度更快(因為它會不情願地前進幾十個字符,而貪婪的情況可能必須前進數千個字符,然後備份其中的大多數字符。 )
回覆:提取網頁的一部分謝謝@Craige_Hales
這一擊,猶如閃電一般!準確地提取我想要的內容,並且在不同的 YouTube 頁面上都很強大。
這是我的最終版本
New Table( "Video list",
Add Rows( 3 ),
New Script(
"bring description from YouTube",
For( i = 1, i <= N Rows(), i++,
page = Open( :link[i] );
division = Regex(
page,
"<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
:webpagetext[i] = withouttags;
)
),
New Column( "Video",
Character,
"Nominal",
Set Values(
{"Getting Started With JMP, Part 1", "Getting Started With JMP, Part 2",
"Getting Started With JMP, Part 3"}
)
),
New Column( "Link",
Character( 83 ),
"Nominal",
Set Values(
{
"https://www.youtube.com/watch?v=xge-f1KV_oc&list=PL411D719858B57C47&index=2&t=5s",
"https://www.youtube.com/watch?v=xhZVuDrKiEA&list=PL411D719858B57C47&index=3&t=0s",
"https://www.youtube.com/watch?v=1M8LzJ8bjwg&list=PL411D719858B57C47&index=4&t=0s"
}
)
),
New Column( "webpagetext", Character, "Nominal", Set Values( {"", "", ""} ) )
)回覆:提取網頁的一部分您正在嘗試從 javascript json 片段中獲取文字。 我認為從 HTML 往下獲取它會更容易。 我在用著 。代替引號只是為了避免 \ 轉義。 這個
...
之所以有效,是因為這個 ...
中沒有嵌套的 ,這會使其提前結束。 正規表示式本身不處理巢狀結構(但模式比對可以)。
請注意,div 的 id= 正在標識您想要的文本,因此它在一段時間內可能相當強大。
page = open ("https://youtu.be/yvoddqG-lm8");
division = Regex ( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>","",globalreplace);「Mia Stephens 展示如何在 JMP 中執行基本統計分析。 她介紹如何使用分佈一次分析一個變數的資料。 使用 Fit Y by X 進行涉及兩個變數的分析,使用擬合模型進行涉及兩個以上變數的分析。 她還回顧了用於匯總和繪製數據圖表的工具。該視頻是第三部分,是學習使用 JMP 的基礎知識的系列視頻,以充分利用 JMP 30 天免費試用版或新的 JMP 許可證。 JMP 學術大使 Mia Stephens 示範如何瀏覽 JMP 選單和資料表、將資料匯入 JMP、匯總資料並繪製圖表以及執行基本統計分析。 該演示使用將於 9 月推出的 JMP 11。 查看 JMP 11 中的新功能: http://www.jmp.com/software/preview-j ……”
回覆:提取網頁的一部分謝謝@馬克貝利為您提供解決方案。 它很強大,因為它可以從我嘗試過的任何 YouTube 影片中檢索乾淨的字串。 然而,它帶來了描述的縮短版本(事實證明,每個影片的程式碼包含兩次完整描述和 3 次簡短描述)。
嘗試修改正規表示式命令,我不確定為什麼它們不能像你的那樣工作。 你注意到我的腳本有什麼問題了嗎?
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
// this works well for the short version of the description.
final = Regex ( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
// not working for the long version of the description.
final = Regex ( page, "description\\!":{\!"simpleText\!":\!"(.+?)\\!"},", "\1" );
回覆:提取網頁的一部分謝謝你, @tx尼爾森為了好的方向。 使用最基本的字元函數我已經成功做到了這一點:
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
startingpoint = Contains( page, "description\\!":{\\!"simpleText\\!":\\!"" );
rightremain = Substr( page, startingpoint + 32, Length( page ) );
endpoint = Contains( rightremain, "\\!"},\\!"lengthSeconds" );
final = Substr( rightremain, 0, endpoint - 1 );
Show( final );
此時,當我嘗試將其複製到其他 YouTube 頁面時,我發現完整描述的前綴和後綴有些不一致,因此我必須使用各種前綴和後綴來找到每個頁面的正確起點和終點。
回覆:提取網頁的一部分不久前: Twitter 螢幕擷取與基於 FFT 的交叉淡入淡出
它使用一個非常簡單的正規表示式來定位圖像的 URL:
x = Load Text File( "https://twitter.com/search?q=football&src=typd" );//cat%20OR%20dog%20OR%20turtle%20OR%20rabbit
Pat Match( x, // look for links to jpgs in the html
Pat Regex( "https://[^\!"']+?\.jpg" ) >> link + Pat Test(
// reject some links to small images and duplicates
If( !Contains( link, "bigger" ) & !Contains( link, "normal" ) & duplicate << Contains( link ) == 0,
duplicate[link] = 1; // remember this keeper
dt << addrows( 1 ); // make a row for it
dt:url = link;
dt << runformulas;// make sure it loads
);
1;
) + Pat Fail()// this forces the match to keep trying, recording all links
);
它會循環,不使用 PatRepeat,而是使用 PatFail()。 PatFail 永遠不會匹配並導致匹配器在下一個位置重試。 每次它發現https://<不含 ! 的文本" 或 ' >.jpg它運行一些 JSL 來處理 URL。
剛剛嘗試了一下,顯然足球仍然是一個可行的搜尋字詞。 第一次查詢時您將獲得大約 20 張圖片,此後每隔幾分鐘左右就會獲得一張新圖片。
Mark 的做法是正確的,使用 HTML 標籤來識別您想要的內容。
回覆:提取網頁的一部分我喜歡@tx尼爾森建議。 您也可以在字串上使用正規表示式。 你可以偷,呃,我是說學習文字資源管理器中 HTML 標籤的正規表示式。 在任何包含字元資料的列上啟動它。 (您並沒有真正分析此處的文本。)點擊平台頂部的紅色三角形並選擇解析選項 > 自訂正規表示式。 有幾種與 HTML 相關的表達式。 按一下表達式清單下方的新增按鈕 (+) 以前往庫。 加入那些有前途的名字。 編輯器將允許您檢查和修改表達式。 您將透過頂部的範例文字或定義中的範例獲得即時回饋。
這可能很簡單:
Names Default to Here( 1 );
page = Load Text File( "https://youtu.be/yvoddqG-lm8" );
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
就像我說的,我喜歡之前的建議。 但有選擇是好事。
回覆:提取網頁的一部分羅恩,
我已經按照您似乎需要的順序編寫了幾個解析器。我通常不使用 Open() 函數,但我使用 Loat Text File() 將檔案讀入長字串。然後,我使用 Contains() 到達起點,並使用 Substr() 取得從 Contains() 傳回的偏移量之後的所有字元的字串。 由於您正在閱讀 HTML 文件,因此您可以使用其標記語言的結構來配置起點和分隔符號。
祝你好運