首页 > 解决方案 > 使用正则表达式拆分列表

问题描述

我在尝试拆分嵌套列表中的每个元素时遇到了一些麻烦。我在第一次拆分时使用了这种方法。我想对现在嵌套的列表进行另一个拆分。我以为我可以简单地使用同一行代码并进行一些修改goal2 = [[j.split("") for j in goal]],但我仍然遇到一个常见错误:'list' object has no attribute 'split'. 我知道您不能拆分列表,但我不明白为什么我的修改与链接方法有任何不同。这是我的第一个网络抓取项目,我正在寻找网站的电话号码。我想要一些帮助来解决我的问题,而不是新代码,以便我可以继续学习和改进我自己的方法。

import requests
import re
from bs4 import BeautifulSoup


source = requests.get('https://www.pickyourownchristmastree.org/ORxmasnw.php').text
soup = BeautifulSoup(source, 'lxml')

info = soup.findAll(text=re.compile("((?:\d{3}|\(\d{3}\))?(?:\s|-|\.)?\d{3}(?:\s|-|\.)\d{4})"))[:1]
goal = [i.split(".") for i in info]
goal2 = [[j.split("") for j in goal]]

for x in goal:
    del x[2:]

for y in goal:
    del y[:1]



print('info:', info)
print('goal:', goal)

goal2变量输出:

info: ['89426 Green Mountain Road, Astoria, OR 97103. Phone: 503-325-9720. Open: ']
goal: [[' Phone: 503-325-9720']]

goal2带有“ ”变量的所需输出:

info: [info: ['89426 Green Mountain Road, Astoria, OR 97103. Phone: 503-325-9720. Open: ']
goal: [[' Phone: 503-325-9720']]
goal2: ['503-325-9720']

我显然会有更多的数字,但我不想堵塞空间。所以它看起来更像这样:

goal2: ['503-325-9720', '###-###-####', '###-###-####', '###-###-####']

但我想确保每个数字都可以导出到 csv 文件中的新行中。因此,当我创建一个带有标题“电话”的 csv 文件时,上面的每个数字都将位于单独的行中,而不是聚集在一起。我在想我可能需要将我的代码更改为 for 循环???

标签: pythonregexweb-scrapingpycharm

解决方案


这里更简洁的方法是在您的 上进行另一个正则表达式搜索info,例如:

pat = re.compile(r'\d{3}\-\d{3}\-\d{4}')
goal = [pat.search(i).group() for i in info if pat.search(i)]

输出:

goal: ['503-325-9720']

或者,如果每行有多个数字:

# use captive group instead
pat = re.compile(r'(\d{3}\-\d{3}\-\d{4})')
goal = [pat.findall(i) for i in info]

输出:

goal = [['503-325-9720', '123-456-7890']]

推荐阅读