Как извлечь только текст с помощью Beautifulsoup? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть этот код html, и я пытаюсь извлечь только контент, такой как «0004», «Март 2020», «300 950 $» и др. c.

   <ul class="plan-info-lst">
    <li>
    <span>Homesite</span>
                            0004
                        </li>
    <li>
    <span>Est. availability</span>
                                March 2020
                            </li>
    <li>
    <span>Priced From</span>
                        $300,950
                        <a href="javascript:void(0);" v-on:click="openEstimatedPaymentModal">Est. payment</a>
    </li>
    <li>
    <span>Home Size</span>
                            2161 sq.ft.
                        </li>
    <li>
    <span>Stories</span>
                            2
                        </li>
    <li>
    <span>Beds</span>
                            3
                        </li>
    <li>
    <span>Baths</span>
                            2.5
                        </li>
    <li>
    <span>Garage</span>
                            2
                        </li>
    </ul>

Я пытался использовать эту технику, но с этим я также получаю другой текст, такой как «Homesite», «Est. доступность », et c. Могу ли я получить только другой контент?

gettext = soup_level2.find('ul', {'class' : "plan-info-lst"}).get_text()

Ответы [ 4 ]

1 голос
/ 28 февраля 2020

Другое решение.

from simplified_scrapy import SimplifiedDoc
doc = SimplifiedDoc(html)
lis = doc.selects('ul.plan-info-lst>li')
for li in lis:
    # print (li.span.text)
    print (li.span.nextText())

Результат:

0004
March 2020
$300,950
2161 sq.ft.
2
3
2.5
2
0 голосов
/ 27 февраля 2020

Это немного не элегантно, но может быть сделано без регулярных выражений (что не рекомендуется для html):

Первое добавление:

from bs4 import NavigableString

Затем

for i in gettext.find_all('li'):
    if i.text:
        targets = i.children
        for target in targets:
            if isinstance(target, NavigableString) and len(target.strip())>0:
                print(target.strip())

Вывод:

0004
March 2020
$300,950
2161 sq.ft.
2
3
2.5
2
0 голосов
/ 27 февраля 2020

Спасибо за вашу помощь !! Я нашел очень простое и легкое решение:

contents=[]
a=soup_level2.find('ul',  class_ ='plan-info-lst')
for names in a.find_all('li'):
    contents.append(names.span.next_sibling.strip()) 
0 голосов
/ 27 февраля 2020

Похоже на работу для регулярных выражений ! Вы можете использовать его для соответствия шаблонам в вашей строке. В вашем случае все ваши данные появляются сразу после тега </span> с последующим переводом строки и отступом. Поэтому, если мы сопоставим этот шаблон следующим образом:

import re
your_data=[] # Initialize the list so we can access it outside scope of with
with open('your_file.html','r') as f:
    your_code = f.read()
    your_data = re.findall('</span>\n +(.+)',your_code)

print(your_data)

, мы можем получить вывод ['0004', 'March 2020', '$300,950', '2161 sq.ft.', '2', '3', '2.5', '2'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...