常规经验在特殊情况下不起作用

2024-05-13 21:33:45 发布

您现在位置:Python中文网/ 问答频道 /正文

使用regex时无法提取特定字段检索方法。 显示的错误为:

raw_add = re.search(search_add.decode('utf-8'),i.decode('utf-8')).group()
AttributeError: 'NoneType' object has no attribute 'group'

我的代码如下:

import urllib2
import re
from json import dump

dumped_data = []
url = 'http://levi.in/store-finder/content/cityAddress.xml'
data = urllib2.urlopen(url).read()

class theAddress():
    city = ""
    state = ""
    lat = ""
    lng = ""
    area = ""
    addr = ""

broken_pieces = re.compile('(?<=marker ).+?(?="\/>)')
all_broken_pieces = re.findall(broken_pieces,data)

search_add = '(?<=html=").+?(?=Tel|<\/p>)'


for i in all_broken_pieces:
    obj = theAddress()
    obj.city = re.search('(?<=city=").+?(?=")',i).group()
    obj.state = re.search('(?<=state=").+?(?=")',i).group()
    obj.lat = re.search('(?<=lat=").+?(?=")',i).group()
    obj.lng = re.search('(?<=lng=").+?(?=")',i).group()
    obj.area = re.search('(?<=label=").+?(?=")',i).group()


    raw_add = re.search(search_add.decode('utf-8'),i.decode('utf-8')).group()
    try:

        process1 = re.sub('&lt;h5&gt;','',raw_add)
        process2 = re.sub('&lt;/h5&gt;',' ',process1)
        process3 = re.sub('&lt;p&gt;','',process2)
        process4 = re.sub('&lt;br /&gt;',' ',process3)
        process5 = re.sub('&lt;/p&gt;','',process4)
        process6 = re.sub('&amp;','&',process5)

        obj.addr = process6
    except:
        pass

    dumped_data.append(obj.__dict__)

    f = open('levis_address1111.json','w')
    dump(dumped_data, f, indent = 1)

这里的问题是,每当正则表达式匹配的地址以“Tel”结尾时,数据就会被提取出来,但当它以“<;/p>;”结尾时,错误就会弹出。你知道吗


Tags: importltgtreaddobjsearchdata
2条回答

正如beerbajay所建议的,如果您想绕过这个错误,请在尝试提取组之前检查是否有匹配项(正如错误所说,这对NoneType不起作用(没有regex匹配项))。你知道吗

尝试您的示例并打印一些调试信息,我发现:

debug i: city="Amravati" state="Maharashtra" lat="20.930138" lng="77.754321" html="&lt;h5&gt;Tri Star Retail Pvt. Ltd(OLS):&lt;/h5&gt; &lt;p&gt;Near HDFC Bank,&lt;br /&gt;Main Market Road, &lt;br /&gt;Jaystambh Chowk Road,&lt;br /&gt;Amravati-440601. &lt;br /&gt;Tel: 0721-561396&lt;/p&gt;" label="Amravati" icontype="Levi\'s" category="&lt;h5&gt;Levi\'s Showroom:&lt;/h5&gt; &lt;p&gt;Near HDFC Bank,&lt;br /&gt;Main Market Road, &lt;br /&gt;Jaystambh Chowk Road,&lt;br /&gt;Amravati-440601.&lt;/p&gt;


raw_add: &lt;h5&gt;Tri Star Retail Pvt. Ltd(OLS):&lt;/h5&gt; &lt;p&gt;Near HDFC Bank,&lt;br /&gt;Main Market Road, &lt;br /&gt;Jaystambh Chowk Road,&lt;br /&gt;Amravati-440601. &lt;br /&gt;


debug i: city="Bangalore" state="Karnataka" lat="12.935816" lng="77.610294" html="&lt;img src=\'../Images/FindUs/LoopProgram.gif\' style=\'float:right; padding-left:5px;\' alt=\'Levi\xe2\x80\x99s\xc2\xae Loop Program\' /&gt;&lt;h5&gt;Prakruthi Apparels(OLS):&lt;/h5&gt; &lt;p&gt;Housur road, Forum mall,&lt;br /&gt; Bangalore.&lt;/p&gt;" label="Forum mall" icontype="Levi\'s" category="&lt;img src=\'../Images/FindUs/LoopProgramW.gif\' style=\'float:right; padding-right:5px;\' alt=\'Levi\xe2\x80\x99s\xc2\xae Loop Program\' /&gt;&lt;h5&gt;Levi\'s Showroom:&lt;/h5&gt;&lt;p&gt;Housur road,&lt;br /&gt;Forum mall,&lt;br /&gt; Bangalore.&lt;/p&gt;

第一个'debug i'是包含“Tel”的字符串,因此存在匹配项。在第二个示例中,我没有看到任何<;/p>;,因此您的正则表达式不匹配。您可能需要对regex进行更多的调试/包括更多可能的场景。 实际上,通常最好不要使用regex进行html/xml解析。你知道吗

刚刚调试了一段代码,字符串似乎是html转义的,所以您应该将regex改为:

search_add = '(?<=html=").+?(?=Tel|&lt;\/p&gt;)'

相关问题 更多 >