如何使用python获取span值,美化组

2024-04-25 19:24:39 发布

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

我第一次使用BeautifulSoup,试图从soup对象中收集一些数据,如电子邮件、电话号码和邮件地址。

使用正则表达式,我可以识别电子邮件地址。我查找电子邮件的代码是:

def get_email(link):
mail_list = []
for i in link:
        a = str(i)
        email_pattern = re.compile("<a\s+href=\"mailto:([a-zA-Z0-9._@]*)\">", re.IGNORECASE)
        ik = re.findall(email_pattern, a)
        if (len(ik) == 1):
                mail_list.append(i)
        else:
                pass
s_email = str(mail_list[0]).split('<a href="')
t_email = str(s_email[1]).split('">')
print t_email[0]

现在,我还需要收集电话号码,邮寄地址和网址。我认为在美联一定有一个简单的方法找到这些具体的数据。

html页面示例如下:

<ul>
    <li>
    <span>Email:</span>
    <a href="mailto:abc@gmail.com">Message Us</a>
    </li>
    <li>
    <span>Website:</span>
    <a target="_blank" href="http://www.abcl.com">Visit Our Website</a>
    </li>
    <li>
    <span>Phone:</span>
    (123)456-789
    </li>
    </ul>

使用BeatifulSoup,我试图收集电子邮件、网站和电话的跨度值。

提前谢谢。


Tags: 数据re电子邮件email地址link电话号码mail
1条回答
网友
1楼 · 发布于 2024-04-25 19:24:39

代码中最明显的问题是,将表示链接的对象转换回HTML,然后再次使用正则表达式对其进行解析,这忽略了首先使用BeautifulGroup的大部分要点。您可能需要使用正则表达式来处理href属性的内容,但仅此而已。而且,else: pass是不必要的-您可以完全忽略它。

下面是一些代码,可以实现您想要的功能,这可能是一个有用的起点:

from BeautifulSoup import BeautifulSoup
import re

# Assuming that html is your input as a string:
soup = BeautifulSoup(html)

all_contacts = []

def mailto_link(e):
    '''Return the email address if the element is is a mailto link,
    otherwise return None'''
    if e.name != 'a':
        return None
    for key, value in e.attrs:
        if key == 'href':
            m = re.search('mailto:(.*)',value)
            if m:
                return m.group(1)
    return None

for ul in soup.findAll('ul'):
    contact = {}
    for li in soup.findAll('li'):
        s = li.find('span')
        if not (s and s.string):
            continue
        if s.string == 'Email:':
            a = li.find(mailto_link)
            if a:
                contact['email'] = mailto_link(a)
        elif s.string == 'Website:':
            a = li.find('a')
            if a:
                contact['website'] = a['href']
        elif s.string == 'Phone:':
            contact['phone'] = unicode(s.nextSibling).strip()
    all_contacts.append(contact)

print all_contacts

它将为每个找到的联系人生成一个字典列表,在这种情况下,它只是:

[{'website': u'http://www.abcl.com', 'phone': u'(123)456-789', 'email': u'abc@gmail.com'}]

相关问题 更多 >