2

私はしばらくの間、htmlタグの属性を見つける作業正規表現を生成しようとしていますが、それらはすべて何らかの形で失敗しているようです。

1 つの html タグをチェックするだけでは、beautifulsoup の読み込みに時間がかかりすぎるため、正規表現を使用します。

チェックする必要があるタグ/プロパティの例を次に示します。

<meta content="http://domain.com/path/path/file.jpg" rnd_attr="blah blah"      
   property="og:image"/>

タグが「og:image」であることを確認しながら、正規表現でこのタグのコンテンツを取得するにはどうすればよいでしょうか。

この質問が少し素朴であるか、正規表現を生成するのが非常に難しい場合は申し訳ありません。

ボーナス: BeautifulSoup 以外に、Python には DOM パーサリッシュの高速で動作する代替手段はありますか?

ありがとう。

4

3 に答える 3

3

実際にベンチマークを行って、BeautifulSoup がボトルネックであることがわかりましたか?

content = soup.find('meta', property='og:image').get('content')

はるかに高速なlxmlを使用することもできます。

import lxml.html

root = lxml.html.fromstring(html)  # Use .parse() on a file-like object instead

content = root.xpath('/html/head/meta[@property="og:image"][1]/@content')
于 2013-07-21T02:29:12.113 に答える
2

説明

この表現は

  • 属性を持つメタタグを見つけるproperty="og:image"
  • いくつかの本当に難しいエッジケースを避ける
  • content 属性の値を取得する
  • 属性を任意の順序で表示できるようにする

<meta(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sproperty=(?:'og:image|"og:image"|og:image))(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\scontent=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?:[^'">=]*|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>

ここに画像の説明を入力

このライブの例では、最初の 2 つのメタ タグ サンプル テキストの難しいエッジ ケースに注意してください: http://www.rubular.com/r/YY70uaGPLE

サンプルテキスト

<meta info=' content="DontFindMe" ' content="http://domain.com/path/path/file1.jpg" random_attr="blah blah"      
   property="og:image"/>
<meta content="http://domain.com/path/path/file2.jpg" random_attr="blah blah"      
   property="og:image"/>
<meta random_attr="blah blah"   property='og:image' content="foo'"   />

マッチ

[0][0] = <meta info=' content="DontFindMe" ' content="http://domain.com/path/path/file1.jpg" random_attr="blah blah"      
   property="og:image"/>
[0][1] = "http://domain.com/path/path/file1.jpg"


[1][0] = <meta content="http://domain.com/path/path/file2.jpg" random_attr="blah blah"      
   property="og:image"/>
[1][1] = "http://domain.com/path/path/file2.jpg"


[2][0] = <meta random_attr="blah blah"   property='og:image' content="foo'"   />
[2][1] = "foo'"
于 2013-07-21T02:29:33.237 に答える