2017-01-12 12 views
3

私はBeautifulSoupを使っていくつかの古代のHTMLファイルの相対URLをアーカイブサイトから絶対URLに変換しています(ほとんどの場合、.htaccessルールでより良いターゲットにすることができます)。この部分は私がダウンしている:特定のタグとそのattを検索し、urllib.parse.urljoin(これはPython3)を使って修正する。ファイン。BeautifulSoupとphp/htmlファイル

しかし、このWebサイトの後年から、このコレクションにもいくつかの.phpファイルがあります。彼らは主に他の.phpファイルを含めるために3-5行を使用し、残りはHTMLですが、いくつかの例外があります。

問題: BeautifulSoupパーサーは、<?php ?>タグを解釈しようとします。実際に、彼らはちょうど角括弧を投げるが、疑問符を残す例があるように見える - 私はhackishlyので、対処行動:

for c in soup.contents: 
    c = str(c) # previously a BeautifulSoup Tag 

    # I don't need soup after this point, hence not reconstructing contents 
    c = ('<' if c.startswith('?') else '') + c 
    c = c + ('>' if c.endswith('?') else '') 

しかし、いずれにしても、私はその全体<?php ?>タグに気づきましたパーサに応じて異なる方法で、しばしば混乱しました。

<? 
//echo "BEGIN PAGE: " . $_SESSION["i"]."<br>"; 
include ('util.php'); 

をそして<br>を閉じ>で終わるようにタグを解釈:たとえば、html5libパーサーは、これらの行を取ります。

私が起こることを望むのは、PHPタグを単独で放置することです。 (もちろん、理想的な世界では、パーサーは、それらを介して読んでいましたし、任意の内側のHTML上で動作し、それはあまりにも多くを求めるように思える!)

可能な解決策

  1. は、ファイルを.phpのスキップのみ.htmlを使って作業する - 作業は必須ではなく、最適化だけなので大きな損失は発生しません。
  2. これらのケースをよりよく処理するドキュメントには記載されていないBeautifulSoupパーサーがあります。
  3. テキストをあらかじめ解析して、すべて<?php ?>ブロックを抽出し、BeautifulSoupの作業が完了した後に再挿入します。これらのファイルの何千ものファイルのうち、 HTML行など)
  4. 上記と同様に、すべての<?php ?>タグをパーサーからプログラムで保護します。 ...彼らの周りのHTMLコメントを挿入して、自分の質問に答えるためにスープ
+0

自分の質問に対する回答がある場合は、その質問に質問を含めるのではなく、回答として追加することができます。 –

+0

答えが分かっていれば、なぜあなたはそれを尋ねますか? – Juggernaut

+0

このフォーマットに慣れていないと変わって見えるかもしれませんが、それを行うのが好ましい方法です。 [詳細については、ヘルプセンターを参照してください。] –

答えて

1

後に保護を削除:)

私は、溶液#4を使用:プログラムで挿入することで、パーサーからすべて<?php ?>タグを守りますそれらの周りのHTMLコメント。パーザは、コメント内にあるものの解釈をスキップします。 soup.prettify()またはsoup.contentsを使用した場合、後で、出力はちょうど<?<!--<?を交換し、同様に終了タグのための簡単なを与えることができます。

特定のHTMLタグ内で動的コンテンツを生成するために使用されるPHPタグでは機能しません。:html.parserlxml、およびhtml5libすべての

<a href= "<? echo foo_bar(); ?>" > 

現在のバージョンでは、PHPタグをHTMLコメントで囲まれている場合でも、<a>のナンセンス一連の属性としてこれを解釈します。そのような場合、手動で代わりに私の問題を解決する正規表現を使用してタグを抽出しました。