我已经在python中与BeautifulSoup
一起编写了一个脚本,以便从某些addresses
中抓取html elements
。 addresses
由br
标记分隔,因此我无法使用next_sibling
获取所有标记。我尝试过两种不同的方法来接触它们。然而,后者略微接近。我仍然不确定什么应该是有效的方法来获得addresses
,就像我在预期输出中粘贴的方式一样。提前谢谢。
Elements
所在的 addresses
:
<div class="item-listing">
<h4><a href="/alps/" target="_blank">AK</a></h4>
5200 A St Ste 102<br>
Anchorage, AK 99518<br>
Phone: (907) 563-9333
<br>
<ul class="list-items" style="margin-top: 5px;">
<li style="padding: 3px; background: #efefef; border-radius: 4px;"><img src="/images/icon-rec.png" style="height: 24px; width: 24px;" alt="Rl" data-toggle="tooltip" data-placement="top" title="Sales"></li>
</ul>
<a style="margin-right: 10px;" href="http://www.alps.com/?" target="_blank">Website</a>
<a href="/al/anchorage/" target="_blank">Profile</a>
</div>
到目前为止我尝试过:
soup = BeautifulSoup(content,"lxml") #here content holding the elements above
for items in soup.select(".item-listing"):
addr = [item.next_sibling for item in items.select("h4")]
# addr = [item.string for item in items.select_one("h4").next_siblings if not item.name=="a"]
print(addr)
第一个addr
的结果(来自脚本):
['\n 5200 A St Ste 102']
评论结果addr
:
['\n 5200 A St Ste 102', None, '\n Anchorage, AK 99518', None, '\n \n Phone: (907) 563-9333\n ', None, '\n', None, '\n', '\n', '\n']
我的预期输出(或非常接近):
5200 A St Ste 102 Anchorage, AK 99518 Phone: (907) 563-9333
答案 0 :(得分:3)
看起来您只需要更新列表解析以考虑空白和None
值。
请改为尝试:
addr = [item.string.strip() for item in items.select_one("h4").next_siblings if item and item.string and not item.name=="a"]`
使用item.string.strip()
将消除额外的空白和\n
。
添加if item
会过滤掉None
值。
这应该导致
['5200 A St Ste 102', 'Anchorage, AK 99518', 'Phone: (907) 563-9333']
您可以加入非空元素:
' '.join([a for a in addr if a])
将导致
'5200 A St Ste 102 Anchorage, AK 99518 Phone: (907) 563-9333'