Python中提取数据的正则表达式
我试图从一个网页中提取一些联系方式,我用BeautifulSoup成功地提取了一些信息 但是我不能提取一些数据,因为它没有正确构造(html)。所以我使用正则表达式。但在过去的几个小时里,我正在努力学习正则表达式,我有点被打动了Python中提取数据的正则表达式,python,regex,Python,Regex,我试图从一个网页中提取一些联系方式,我用BeautifulSoup成功地提取了一些信息 但是我不能提取一些数据,因为它没有正确构造(html)。所以我使用正则表达式。但在过去的几个小时里,我正在努力学习正则表达式,我有点被打动了 InstanceBeginEditable name="additional_content" <h1>Contact details</h1> <h2>Diploma coordinator</h2>
InstanceBeginEditable name="additional_content"
<h1>Contact details</h1>
<h2>Diploma coordinator</h2>
Mr. Matthew Schultz<br />
<br />
610 Maryhill Drive<br />
Green Bay<br />
WI<br />
United States<br />
54303<br />
Contact by email</a><br />
Phone (1) 920 429 6158
<hr /><br />
有时我一个也得不到
请帮帮我
内容在网上免费提供,不侵犯版权 好,使用您的数据,编辑将解析例程嵌入函数中
def parse_list(source):
lines = ''.join( source.split('\n') )
lines = lines[ lines.find('</h2>')+6 : lines.find('Contact by email') ]
lines = [ line.strip()
for line in lines.split('<br />')
if line.strip() != '']
return lines
# Parse the page and retrieve contact string from the relevant <div>
con = ''' InstanceBeginEditable name="additional_content"
<h1>Contact details</h1>
<h2>Diploma coordinator</h2>
Mr. Matthew Schultz<br />
<br />
610 Maryhill Drive<br />
Green Bay<br />
WI<br />
United States<br />
54303<br />
Contact by email</a><br />
Phone (1) 920 429 6158
<hr /><br />'''
# Extract details and print to console
details = parse_list(con)
print details
你问过用正则表达式做这个。假设您为每个div获取了一个包含此数据的新多行字符串,您可以按如下方式提取数据:
import re
m = re.search('</h2>\s+(.*?)<br />\s+<br />\s+(.*?)<br />\s+(.*?)<br />\s+(.*?)<br />\s+(.*?)<br />\s+(.*?)<br />', con )
if m:
print m.groups()
我看你用正则表达式开始的时候还行。正则表达式的关键是要记住,您通常需要定义一个数字或一组数字,然后是一个数量表达式,它告诉您希望表达式重复多少次。在本例中,我们从
开始,然后是\s+
,它告诉正则表达式引擎我们需要一个或多个空格字符(包括换行符)。这里唯一的另一个细微差别是下一个表达式,它是(.*)
,是一个懒惰的捕获全部-它将捕获任何内容,直到它运行到下一个表达式,即下一个
编辑:另外,您应该能够利用以下事实清理正则表达式:在名称之后,所有地址信息都是统一格式的。我玩了一点,但没有得到它,所以如果你想改进它,那将是一种方法。不要使用循环和重复concats来生成一个大字符串,使用
“”。join(iterable)
-它会更快(并确保在所有平台上都有良好的性能,而不仅仅是在CPython上)。感谢pal提供的信息。你能添加一个较长的源html代码片段和几个你想提取的地址示例吗?这将有助于起草更有用的答案。例如:联系人的前面总是有文凭协调员
,后面是行电子邮件联系人
?好吧,如果我把整个来源都放在这里,那就太多了。我用了美丽的汤来提取这个div。所有的都是这样的格式。非常感谢你们的努力。但是我犯了一个错误。回溯(最近的最后一次调用):文件“E:\python\Fiverr\src\Test.py”,第33行,第3行=“”.join(con.split('\n'))AttributeError:“NoneType”对象没有属性“split”您似乎编辑了该行,并将源
变量更改为con
——您在con
中输入了什么?我已将例程编辑成一个函数,您应该能够在任何字符串中使用该函数,格式与您的示例完全相同。希望这有帮助。
['Mr. Matthew Schultz', '610 Maryhill Drive', 'Green Bay', 'WI', 'United States', '54303']
import re
m = re.search('</h2>\s+(.*?)<br />\s+<br />\s+(.*?)<br />\s+(.*?)<br />\s+(.*?)<br />\s+(.*?)<br />\s+(.*?)<br />', con )
if m:
print m.groups()
('Mr. Matthew Schultz', '610 Maryhill Drive', 'Green Bay', 'WI', 'United States', '54303')