-1

HTMLからカスタムvin番号を解析する必要があります

間違った一致数もほとんどありません。

 .....
 <meta name="google-site-verification" content="l4du7Ao9MH6TM2nJ5L54qqWoXWcuOkdeqhXCADgKErc" />
 <meta name="msvalidate.01" content="FAD32C2469C51767894EB50068D37244" />
     .....
  <div class="hproduct auto chevrolet" data-classification="primary" data- vin="3GNDA23D18S647673" data-make="Chevrolet" >

 .....
 </dd></dl><dl class='vin'><dt>VIN:</dt><dd>3GNDA23D18S647673</dd></dl> <span 
 ....... etc....

これは、必要な部分を含む html の一部です。

Pythonで正規表現を適用すると

import re
re.findall("([0-9A-Z]{8}[0-9xX]{1}[1-9A-Y^U]{1}[0-9A-Z]{2}[0-9]{5})",html)

次のような不要なデータとともに必要な結果を取得します

['FAD32C2469C517678',
 '3GNDA23D18S647673',
 '3GNDA23D18S647673']

FAD32C2469C517678 は不要なものです。

Pythonの正規表現でこの不要なパターンを取り除くにはどうすればよいですか?

4

2 に答える 2

3

パーサーを使用してください:

import lxml.html as lh
doc=lh.fromstring(html)
doc.xpath('.//@vin')

アウト

["3GNDA23D18S647673"]

編集: vin が常に属性であるが、名前がわからない場合は、次を試すことができます:

doc.xpath('.//@*[string-length() = "17"]') # get's attrs with lenght 17

または、正規表現を使用する場合は、本当に必要な場合:

import re
re.findall('"([A-Z0-9]{17})"',html)
于 2013-01-07T11:50:56.297 に答える
1

実際にはHTML パーサーを使用する必要がありますが、迅速な修正には regexp を使用します(?<=vin=")[^"]+

>>> import re
>>> html = """.....
...  <meta name="google-site-verification" content="l4du7Ao9MH6TM2nJ5L54qqWoXWcuOkdeqhXCADgKErc" />
...  <meta name="msvalidate.01" content="FAD32C2469C51767894EB50068D37244" />
...      .....
...   <div class="hproduct auto chevrolet" data-classification="primary" data- vin="3GNDA23D18S647673" data-make="Chevrolet" >
... 
...  .....
...  </dd></dl><dl class='vin'><dt>VIN:</dt><dd>3GNDA23D18S647673</dd></dl> <span 
...  ....... etc...."""

>>> re.findall('(?<=vin=")[^"]+',html)
['3GNDA23D18S647673']

これは、後ろの文字列の後に、肯定的な後読みを使用して[^"]+ (二重引用符ではない 1 つまたは複数の文字)を一致させますvin="

一致をより厳密にしたい場合は、正の後読みと組み合わせて正規表現を使用できます。

re.findall('(?<=vin=")[0-9A-Z]{8}[0-9xX]{1}[1-9A-Y^U]{1}[0-9A-Z]{2}[0-9]{5}',html)
['3GNDA23D18S647673']
于 2013-01-07T11:49:53.323 に答える