Проблемы с получением предметов из грязных элементов - PullRequest
0 голосов
/ 09 мая 2018

Я написал скрипт на 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

1 Ответ

0 голосов
/ 09 мая 2018

Похоже, вам просто нужно обновить понимание списка, чтобы учесть пропуски и значения 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...