2017-06-06 259 views
1

的Twitter返回的網頁,這些線是其中包括:如何從網頁中提取網址?

<link rel="dns-prefetch" href="//video.twimg.com" /> 
<link rel="preload" as="script" crossorigin="anonymous" href="https://ma-0.twimg.com/twitter-assets/responsive-web/web/ltr/vendor.69f9ac19fa493004.js" /> 
<link rel="preload" as="script" crossorigin="anonymous" href="https://ma-0.twimg.com/twitter-assets/responsive-web/web/ltr/i18n/en.312d3f56908013c9.js" /> 
<link rel="preload" as="script" crossorigin="anonymous" href="https://ma-0.twimg.com/twitter-assets/responsive-web/web/ltr/main.da8c0a0fbf03fdac.js" /> 
<meta property="fb:app_id" content="2231777543" /> 

我需要的是包含了main.*.js文件的URL。我怎麼才能得到它?

我嘗試這樣做:

var mainIndex = content.IndexOf("main."); 
var startIndex = content.LastIndexOf("href=\"", mainIndex) + 6; 
var endIndex = content.IndexOf(".js", startIndex) + 3; 
var url = content.Substring(startIndex, endIndex - startIndex); 

,但它是一個不好的不安全實現。謝謝。

+0

使用正則表達式(正則表達式)。 – arminb

+2

從不,從不從不使用正則表達式來解析網頁。非常糟糕的建議。對從html中提取的子字符串使用正則表達式是可以的。你應該使用GetElementsByTagName(「link」),然後提取返回字符串的屬性href。 – jdweng

+2

也很關鍵:https://stackoverflow.com/a/1732454/2546433 –

回答

3

您可以用專用的HTML解析器做到這一點,如Html Agility Pack

var text = "<link rel=\"dns-prefetch\" href=\"//vide.... />"; 
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(text); 

var links = doc 
    .DocumentNode 
    .SelectNodes("//link") 
    .Select(e=>e.Attributes["href"].Value); 

links 
    // here, you could parse and match the URL robustly 
    .Where(href=>href.Contains("main")) 
    // try it in LINQPad 
    .Dump(); 

結果:https://ma-0.twimg.com/twitter-assets/responsive-web/web/ltr/main.da8c0a0fbf03fdac.js

+0

謝謝@dmitryLedentsov ..我現在嘗試 – Blendester

+0

對不起,它沒有'.SelectNodes'方法..我錯過了一個using指令? – Blendester

+0

@Blendester是的,你需要一個'使用HtmlAgilityPack;'行。你有沒有通過Nuget安裝它? –

-3

對它使用正則表達式絕對是一個好主意。 用於前綴部分的第一個正則表達式,應該用空字符串替換,最後用相同的東西替換。
您需要使用\ <來跳過像<這樣的字符,並使用正常的正則表達式語法來準確定義所需的內容。