首页 > 解决方案 > 使用正则表达式查找字符串模式并将结果附加到列表中

问题描述

我是一个re在 Python 上使用库的菜鸟。我正在做 Web Scraping,我想匹配一些字符串模式并将值附加到列表中。例如:

parking = []
rooms  = []
toilets = []


attribute = soup.find('ul',{'class':'specs-list'}).find_all('li')
for a in attribute:
    print(a.text)

输出索引为 0 的迭代 a

Metters
50 m�

Rooms
2

Toilets
1

输出索引为 1 的迭代 a

   Metters
   50 m�
   
   parking 
   1
   
   spends
   340 

 

因此,例如,我想匹配标题的名称,如果存在于 A 值上,我想将结果附加到每个列表中

伪代码:

for a in attribute:
  if a contains "Rooms":
     rooms.append(a)
  if a contains "Parking":
     parking.append(a)
  if a contains "toilets":
     parking.append(a)


  if a not contains strings above:
     rooms.append(nan)
     parking.append(nan)
     rooms.append(nan)

我使用 BeautifulSoup 创建网页抓取,属性值的结果如下:

索引 0 的属性变量输出:

[<li class="specs-item">
<strong>Metters</strong>
<span>50 m�&lt;/span>
</li>,<li class="specs-item">
<strong>Rooms</strong>
<span>2</span>
</li>,<li class="specs-item">
<strong>Toilets</strong>
<span>1</span>
</li>,<li class="specs-item">
<strong>Spends</strong>
<span>340</span></li>]

一个属性的长度为 0f 5 个值,每个值的代码都与上述相似,但标题和值不同,有人包含停车场、房间、厕所,其他人只有厕所和房间,等等。

标签: pythonpython-3.xstringre

解决方案


这应该可以帮助你:

from bs4 import BeautifulSoup
import requests 

parking = []
rooms  = []
toilets = []

html = requests.get('website url').text

soup = BeautifulSoup(html,'html.parser')

attribute = soup.find_all('li',{'class':'specs-item'})

for a in attribute:
    
    heading = a.strong.text
    span = a.span.text
    
    if heading == "Parking":
        parking.append(span)
    elif heading == "Rooms":
        rooms.append(span)
    elif heading == "Toilets":
        toilets.append(span)
    
print("Parking =" , parking)
print("Rooms =", rooms)
print("Toilets =", toilets)

liu 提供的值的输出:

Parking = []
Rooms = ['2']
Toilets = ['1']

编辑:

虽然这可行,但我觉得拥有这么多lists并不是一个好方法。相反,您可以使用dictionary. 这就是你如何使用 a 实现相同的输出dictionary

details_dict = {'Parking':[],
                'Rooms':[],
                'Toilets':[]}
for a in attribute:
    
    heading = a.strong.text
    span = a.span.text
    
    if heading == "Parking" or heading == "Rooms" or heading == "Toilets":
        details_dict[heading].append(span)

print(details_dict)

输出:

{'Parking': [], 'Rooms': ['2'], 'Toilets': ['1']}

我觉得这是一个更好的方法。但这完全取决于你。选择最适合您的任务的。


推荐阅读