0

javascript regex replace を使用して一部の html をクリアするのに問題があります。タスクは、ローカル ソースから XBMC のテレビ リストを取得することです。URL はhttp://tv.dir.bg/tv_search.php?step=1&all=1 (ブルガリア語) です。スクレーパーを使用してデータを取得しようとしています - http://code.google.com/p/epgss/ (Ivan Markov へのクレジット - http://code.google.com/u/113542276020703315321/ ) 残念ながら、上記のツールが最後に更新されてから、テレビ番組表のページが変更されたので、機能させようとしています。問題は、HTML から XML を解析しようとすると壊れることです。私は現在、ヘッドタグとスクリプトタグを正規表現に置き換えて、HTMLを少しきれいにしようとしています。残念ながら、うまくいきません。これが私の置き換えです:

function regexReplace(pattern, value, replacer) 
{  
var regEx = new RegExp(pattern, "g");  
var result = value.replaceAll(regEx, replacer);  
if(result == null)  
return null;  
return result;  
}  

そして、ここに私の電話があります:

var htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251");  
log("Content grabbed (schedule for next 7 days)");  
log(url);  
var htmlString = regexReplace("<head>([\\s\\S]*?)<\/head>|<script([\\s\\S]*?)<\/script>", htmlStringCluttered, "");  

getHTML 関数は、User-Agent の設定を少し変更した元のソースから取得されます。そのベースは次のとおりです。

    public static java.io.Reader open(URL url, String charset) throws UnsupportedEncodingException, IOException  
    {
    URLConnection con = url.openConnection();
    con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.38 Safari/532.0");
    con.setAllowUserInteraction(false);
    con.setReadTimeout(60*1000/*ms*/);

    con.connect();

    if(charset == null && con instanceof HttpURLConnection) {
        HttpURLConnection httpCon = (HttpURLConnection)con;
        charset = httpCon.getContentEncoding();
    }

    if(charset == null)
        charset = "UTF-8";

    return new InputStreamReader(con.getInputStream(), charset);
    }

regexReplace の結果は元のものとまったく同じです。また、XML は解析できないため、スクリプトは要素を読み取ることができません。何か案は?

4

1 に答える 1

1

アップデート:

これをXMLDocumentに変換するには、次のようにします。

var parseXml,
    xml,
    htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251"),
    htmlString = '';

if (typeof window.DOMParser != "undefined") {
    parseXml = function (xmlStr) {
        return (new window.DOMParser()).parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function (xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    throw new Error("No XML parser found");
}

console.log("Content grabbed (schedule for next 7 days)");
console.log(url);

//eliminate the '<head>' section
htmlString = htmlStringCluttered.replace(/(<head[\s\S]*<\/head>)/ig, '')

//eliminate any remaining '<script>' elements
htmlString = htmlString.replace(/(<script[\s\S]+?<\/script>)/ig, '');

//self-close '<img>' elements
htmlString = htmlString.replace(/<img([^>]*)>/g, '<img$1 />');

//self-close '<br>' elements
htmlString = htmlString.replace(/<br([^>]*)>/g, '<br$1 />');

//self-close '<input>' elements
htmlString = htmlString.replace(/<input([^>]*)>/g, '<input$1 />');

//replace '&nbsp;' entities with an actual non-breaking space
htmlString = htmlString.replace(/&nbsp;/g, String.fromCharCode(160));

//convert to XMLDocument
xml = parseXml(htmlString);

//log new XMLDocument as output
console.log(xml);

//log htmlString as output
console.log(htmlString);
  • クレジットが必要なクレジット:parseXml機能は次の場所にあります:

JavaScriptでの変数文字列のXML解析

次のように定義するだけで、ブラウザでこれをテストできます(私は:))htmlStringCluttered

htmlStringCluttered = document.documentElement.innerHTML;

それ以外の:

htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251"),

コンソールでhttp://tv.dir.bg/tv_search.php?step=1&all=1で実行します

また、次の行をコメントアウトする必要があります。

console.log(url);

または宣言urlして値を与えます。

オリジナル:

RegExpにはいくつかの作業が必要でしたが、2つのreplaceステートメントに分割すると、はるかに簡単になります(そして読みやすくなります)。

var htmlStringCluttered = HTML.getHTML(new URL(url), "WINDOWS-1251"),
    htmlString = '';
console.log("Content grabbed (schedule for next 7 days)");
console.log(url);
//eliminate the '<head>' section
htmlString = htmlStringCluttered.replace(/(<head[\s\S]*<\/head>)/ig, '')
//eliminate any remaining '<script>' elements
htmlString = htmlString.replace(/(<script[\s\S]+?<\/script>)/ig, '');
//log remaining as output
console.log(htmlString);

これは、http://tv.dir.bg/tv_search.php?step = 1 &all = 1にアクセスし、コンソールで次のコマンドを実行することにより、コンソールでテストされました。

console.log(document.documentElement.innerHTML.replace(/(<head[\s\S]*<\/head>)/ig, '').replace(/(<script[\s\S]+?<\/script>)/ig, ''));

これがouterHTMLプロパティで実行される場合(HTML.getHTML(new URL(url), "WINDOWS-1251")メソッドが戻ることを期待しているため)、<body>要素は次のようにラップされます。

<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        ...
    </body>
</html>
于 2012-10-27T22:50:12.580 に答える