0

我正在尝试从网页中提取一些联系方式,并使用 Beautiful Soup 成功提取了一些信息。

但我无法提取一些数据,因为它没有正确构造(html)。所以我使用正则表达式。但是最后几个小时我正在尝试学习正则表达式,我有点震惊。

 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 />

我需要提取,

马修·舒尔茨先生

610 Maryhill Drive 绿湾 WI 美国 54303

和电话号码。我尝试了从谷歌搜索中找到的东西。但是没有一个有效(因为我的知识很少,但这是我最后的努力。

con = ""
for content in contactContent.contents:
    con += str(content)

print con

address = re.search("Mr.\b[a-zA-Z]", con)

print str(address)

有时我没有。

请帮助伙计们!

PS。内容在网络上免费提供 没有侵犯版权。

4

2 回答 2

1

好的,使用您的数据,编辑将解析例程嵌入函数中

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

这将输出一个列表:

['Mr. Matthew Schultz', '610 Maryhill Drive', 'Green Bay', 'WI', 'United States', '54303']
于 2012-05-05T11:58:05.143 回答
1

你问过用正则表达式来做这件事。假设您为每个 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()

输出:

('Mr. Matthew Schultz', '610 Maryhill Drive', 'Green Bay', 'WI', 'United States', '54303')

我看到你已经开始使用正则表达式了。正则表达式的关键是记住您通常要定义一个数字或一组数字,然后是一个数量表达式,告诉它​​您希望表达式重复多少次。在这种情况下,我们</h2>以 which 开始,然后\s+告诉正则表达式引擎我们需要一个或多个空格字符(包括换行符)。这里唯一的其他细微差别是下一个表达式,它(.*?)是一个惰性捕获所有 - 它会抓取任何东西,直到它遇到下一个表达式,即下一个<br />

编辑:此外,您应该能够利用名称之后的所有地址信息都采用统一格式这一事实来清理正则表达式。我玩了一点,但没有得到它,所以如果你想改进它,那将是一种方法。

于 2012-05-05T13:16:08.310 回答