【问题标题】:Removing an element from a list between <br/> tags - PYTHON从 <br/> 标签之间的列表中删除元素 - PYTHON
【发布时间】:2020-07-31 13:58:47
【问题描述】:

我正在抓取一个网站,结果以一个 ID 为格式。输出随结果中的中断次数而变化。我构建了一个模式,可以提取公司名称、地址、城市/州和电话号码。

我最初的目标是删除其中包含“SUITE”的任何元素,但一些地址在与实际地址相同的通道中具有“SUITE”并抛出模式。有什么方法可以检查字符串 'SUITE' 之前是否有任何值,如果没有,请将其删除?

for r in list(result_list):
    if '<br/>' in r:
        result_list.remove(r)
    else:
        if 'dba' in r:
            result_list.remove(r)
        else:
            if 'SUITE' in r:
                result_list.remove(r)
            else:
                clean_list.append(r)

示例 1:

1066915 #<- License
BROOKFIELD SOCAL LAND CONSTRUCTORS LLC #<- Business Name (index 0)
<br/>
12265 EL CAMINO REAL #<- Address (index 1)
<br/>
SUITE 180 #<- NOT NEEDED
<br/>
SAN DIEGO, CA 92130 #<- City/State (index 2)
<br/>
Business Phone Number:(714) 427-6868 #<- Phone (index 3)
<br/>
<br/>

示例 2:

1066919
J G CONST CORP #<- company name (index 0) or every 4th element
<br/>
dba J G CONSTRUCTION CORP #<- removed
<br/>
<br/>
449 W FOOTHILL BLVD SUITE #276 #< -Address would be removed with current
<br/>
GLENDORA, CA 91741 #<- City/State (index 2)
<br/>
Business Phone Number:(626) 460-1014 #<- Phone (index 3)
<br/>
<br/>

我的想法是,如果有办法检查套件中 s 之前是否有空格或字符一或两个元素,则不应将其删除。

【问题讨论】:

  • 您在迭代 result_list 时修改它,这总是一个坏主意。如果您不这样做,您的问题会神奇地消失吗?
  • 不确定我是否理解。我以前听说过它的不好做法,但我不熟悉如何多次修改列表的另一种方法
  • @usr2564301。问题与此无关,但建议仍然很好。
  • @sjuice10。你知道elif。更好的是,or?
  • 我提到这个是因为我注意到你有不选择答案的习惯。选择答案会将您的问题从未回答队列中移除,并为帮助您的人(以及您自己)提供一些声誉积分。

标签: python list split


【解决方案1】:

在我回答这个问题之前,让我先介绍一种更优雅的方式来使用elif 而不是嵌套的else-if 来编写您的原始条件语句:

if '<br/>' in r:
    result_list.remove(r)
elif 'dba' in r:
    result_list.remove(r)
elif 'SUITE' in r:
    result_list.remove(r)
else:
    clean_list.append(r)

鉴于您想在每种情况下都做同样的事情,您可以使用or 运算符来编写

if '<br/>' in r or 'dba' in r or 'SUITE' in r:
    result_list.remove(r)
else:
    clean_list.append(r)

但是,您确实不应该修改您正在迭代的列表。因为列表迭代器是按索引工作的,所以实际上每次都在无意中跳过元素。好消息是您根本不需要修改result_list:您只关心以clean_list 结尾的内容。此外,您无需将某些内容放入列表中即可使用 for 对其进行迭代:

for r in result_list:
    if not ('<br/>' in r or 'dba' in r or 'SUITE' in r):
        clean_list.append(r)

最后,要解决包含SUITE 的字符串的实际问题,您可以使用find 获取索引,然后根据该索引进行子集:

for r in result_list:
    index = r.find('SUITE')
    if index == 0 or (index > 0 and r[index - 1].isspace()):
        addr = r[:index].rstrip()
        if addr:
            clean_list.append(addr)
    elif not ('<br/>' in r or 'dba' in r):
        clean_list.append(r)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多