【发布时间】: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 variants 和 Python for and if on one line
【问题讨论】:
标签: python