如何使用beautifulsoup仅提取文本?

2024-09-22 10:25:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个html代码,我试图只提取像“0004”、“2020年3月”、“300950美元”等内容

   <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”。可用性等。是否有办法只获取其他内容

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

Tags: 代码info内容htmlliul技术class
3条回答

这有点不雅观,但可以在没有正则表达式的情况下完成(不推荐用于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

另一个解决方案

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

看起来像是regular expressions的工作!您可以使用它来匹配字符串中的模式。在本例中,所有数据都发生在</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']

相关问题 更多 >