【问题标题】:Scraping a phone number from a list of Contact information从联系信息列表中抓取电话号码
【发布时间】:2020-01-17 20:50:36
【问题描述】:

为了从下面的 html 部分获取/剥离文本,我已经解析了页面并将其放入一个变量中。

从那个变量,我将这些特定的 div 范围缩小到另一个名为 items 的变量。现在剥离文本(在这种情况下为电话号码),我使用了带有 for 循环的列表理解,例如 phone = [item.find(class_='phone').get_text() for item in items]

<div class="description">
<div class="phone">
   <a href="tel:(000) 000 -0000" title="call (000) 000 -0000">
     (000) 000 -0000
     </a>
</div>
<div class="description">
<div class="phone">
   <a href="tel:(111) 111 -1111" title="call (111) 111 -1111">
     (111) 111 -1111
     </a>
</div>

所以我得到了我期望的结果。只是结果中的那些电话号码。 ['(000) 000 -0000','(111) 111 -1111']

我的问题是,当任何 div 下的页面中没有电话号码时。我收到错误“AttributeError:'NoneType' 对象没有属性 'get_text'”

我知道为什么会出现此错误。当结果返回为 none 时,它​​会抛出一个错误,即找不到 none 的 get_text 属性。我已经阅读了 Stackoverflow 中有关此错误的其他文章,但不想使用 try except 方法,而是希望在单行中完成。

这就是我想做的,

运行命令,phone = [item.find(class_='phone') for item in items] 会得到如下所示的内容。

[None, <div class="phone"> <a href="tel:(000) 000-0000" title="call (000) 000-0000">(000) 000-0000</a> </div>, <div class="phone"> <a href="tel:(111) 111-1111" title="call (111) 111-1111">(111) 111-1111</a> </div>

在此之后,如果列表元素具有“None”值,我们是否可以将 if else 和 for 循环组合在一行中以剥离电话号码并打印“None”。

尝试这样的事情,phone = [item='None' if item=='None' else item.find(class_='phone').get_text() for item in items]但是,我没有得到结果。任何帮助表示赞赏。

参考文章,One-line list comprehension: if-else variantsPython for and if on one line

【问题讨论】:

    标签: python


    【解决方案1】:

    问题是您将'None'NoneType 类进行比较。两者不相等。要获得正确的结果,您必须执行以下操作:

    numbers = ['None' if item == None else item.find(class_='phone'.get_text()) for item in items]
    

    请注意我是如何将该项目与None(无类型)而不是'None'(字符串)进行比较的。

    【讨论】:

    • 很抱歉它返回了同样的错误“AttributeError: 'NoneType' object has no attribute 'get_text'”
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多