我正在运行一个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'']
答案 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\('([^']+)'")