次のコード ブロックを perl から python に変換するにはどうすればよいですか?
while ($content2 =~ m{services</B></TD>\s<TD>\s<TABLE>\s<TR>(.*?)</TABLE>}gs) {
my $service=$1
print " service : $1\n";
}
完全なコードにはそれよりも多くの正規表現出力がありますが、その例では変換を進めることができます。
私があなたの正規表現を正しく読んでいる場合、テーブルデータセル内に単一行(データセルなし)のテーブルがあります。ここでどんな忌まわしい料理を作っているのですか?
Python では、これに lxml を使用します。これは本物のパーサーなので、空白や大文字小文字、その他の関係のないドキュメントの構造が変更されても失敗しません。これは標準ライブラリの一部ではありませんが、(/the/ ではないにしても) pypi に最も多くインストールされているライブラリの 1 つです。
abominable_html = '''
<html>
<table><tr><td>services</B></TD>
<TD>
<TABLE> <TR>Interesting stuff!</TABLE>
'''
from lxml.html import fromstring
doc = fromstring(abominable_html)
# These are equivalent, for demonstration purposes.
print doc.xpath('//table/tr/td/table/tr/text()')[0]
print doc.xpath('//table//table/tr')[0].text
ご覧のとおり、疑わしい html を見事に処理します。
「サービス」テキストと一致させる必要がある場合は、次のような条件を追加できます。
print doc.xpath('//table[./tr/td="services"]//table/tr')[0].text
以下に、いくつかの優れた xpath リファレンスを示します。
私はまだそれについて学んでいます:)
まあ、私が基本的に持っているのは、(.*?) によって抽出されたコンテンツは動的な値 (サービス名) であり、データベースに挿入する必要があります (perl では動作しています)。
基本的に必要なのは、タグ間のコンテンツを抽出することです(これは動的です)
以下の例のように、正規表現を使用して、サービスの名前を抽出できます。
$content2 =~ m{<TD valign="top"><B>name</B></TD>\s<TD>(.*?)</TD>\s</TR>\s<TR>\s<TD valign="top"><B>enabled</B></TD>\s<TD>(.*?)</TD>}gs
$service=$1
$status=$2
パーサーを使用してそれを行う方法はありますか? はいの場合、この質問を閉じて新しい質問を開くのが良い方法だと思います。