匹配此网址的正则表达式是什么?

时间:2017-02-19 21:08:42

标签: python regex xpath scrapy

我正在运行一个scrapy项目,我想从响应中提取该文本:

>>> response.xpath('/html/body/table[2]/tr/td/table/tr[2]').extract()
[u'<tr class="over"onclick="HM.set(\'bWFya2V0PT1nZW5lcmFsfHxzdD09MzB8fHN0cz09eyIxMCI6IlJlZ2lvbiIsIjIwIjoiTWlkZGxlIEVhc3QiLCIzMCI6IjRSVU5ORVIgNjcxMzYwIn18fGNhdGFsb2c9PTY3MTM2MHx8cmVjPT1CMw%3D%3D\');">\n<td>671360</td>\n<td>4RUNNER</td>\n<td>11/1995-11/2002</td>\n<td>KZN185,RZN18#,VZN18#</td>\n</tr>']

我需要提取:

bWFya2V0PT1nZW5lcmFsfHxzdD09MzB8fHN0cz09eyIxMCI6IlJlZ2lvbiIsIjIwIjoiTWlkZGxlIEVhc3QiLCIzMCI6IjRSVU5ORVIgNjcxMzYwIn18fGNhdGFsb2c9PTY3MTM2MHx8cmVjPT1CMw%3D%3D

我尝试使用:response.xpath('/html/body/table[2]/tr/td/table/tr[2]').re('[^HM.+D$]*') ,但结果是:

[u'<tr class="over" onclick="', u'', u'', u'', u"set('bWFya2V0PT1nZW5lcmFsf", u'', u'xzd', u'', u'09', u'', u'zB8f', u'', u'N0cz09eyIx', u'', u'CI6IlJlZ2lvbiIsIjIwIjoiTWlkZGxlIEVhc3QiLCIz', u'', u'CI6IjRSVU5ORVIgNjcx', u'', u'zYwIn18fGNhdGFsb2c9PTY3', u'', u'T', u'', u'2', u'', u'', u'x8cmVjPT1C', u'', u'w%3', u'', u'%3', u'', u'\');">\n                                    <td>671360</td>\n                                    <td>4RUNNER</td>\n                                    <td>11/1995-11/2002</td>\n                                    <td>KZN185,RZN18#,VZN18#</td>\n                               </tr>', u'']

1 个答案:

答案 0 :(得分:0)

您可以使用以下表达式:

(?<=HM\.set\(')[^']+

所以在你的情况下,它会转换为:

response.xpath('/html/body/table[2]/tr/td/table/tr[2]').re(r"(?<=HM\.set\(')[^']+")

<强>解释

  • (?<=HM\.set\(') - 匹配子字符串HM.set('的正面后视。
  • [^']+ - 否定字符类,以匹配所有非'个字符一次或多次。

但是,为此只使用捕获组会更有效。

例如:

HM\.set\('([^']+)'

这将是:

response.xpath('/html/body/table[2]/tr/td/table/tr[2]').re(r"HM\.set\('([^']+)'")

您的表达式[^HM.+D$]*无法正常工作,因为[^]是一个否定的字符类,这意味着除了[HM.+D$]之外的所有字符都将匹配(这不是'\ n'你想要的是什么。

作为替代方案,您始终可以检索onclick属性,然后从那里解析值:

response.xpath('/html/body/table[2]/tr/td/table/tr[2]/@onclick').re(r"HM\.set\('([^']+)'")