无法从一些杂乱的元素中获取项目

时间:2018-05-09 15:22:36

标签: python python-3.x web-scraping beautifulsoup

我已经在python中与BeautifulSoup一起编写了一个脚本,以便从某些addresses中抓取html elementsaddressesbr标记分隔,因此我无法使用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

1 个答案:

答案 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'