-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']

这使用正向后向匹配[^"]+ (一个或多个字符不是双引号) after 的字符串vin="

如果你想在你的比赛中更严格,你可以将你的正则表达式与积极的lookbehind结合使用:

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 回答