2016-06-07 2 views
0

У меня есть дамп данных, из которого я пытаюсь извлечь все электронные письма.Извлечь электронные письма из дампа данных с помощью Python

Это код, который я написал, используя BeautifulSoup

import urllib2 
import re 
from bs4 import BeautifulSoup 
url = urllib2.urlopen("file:///users/home/Desktop/emails.html").read() 
soup = BeautifulSoup(url) 
email = raw_input(soup) 
match = re.findall(r'<(.*?)>', email) 
if match: 
    print match 

Выборочных данных свалку

<tr><td><a href="http://abc.gov.com/comments/24-April/file.html">for educational purposes only</a></td> 
<td>7418681641 &lt;[email protected]&gt;</td> 
<td>[email protected]</td> 
<td nowrap="">24-04-2015 10.31</td> 
<td align="center">&nbsp;</td></tr> 
<tr><td><a href="http://abc.gov.com/comments/24-April/test.html">no_subject</a></td> 
<td>John &lt;[email protected]&gt;</td> 
<td>[email protected]</td> 
<td nowrap="">24-04-2015 11.28</td> 
<td align="center">&nbsp;</td></tr> 
<tr><td><a href="http://abc.gov.com/comments/24-April/test.html">something</a></td> 
<td>Mark &lt;[email protected]&gt;</td> 
<td>[email protected]</td> 
<td nowrap="">24-04-2015 11.28</td> 
<td align="center">&nbsp;</td></tr> 
<tr><td><a href="http://abc.gov.com/comments/24-April/abc.html">some data</a></td> 

я могу ясно видеть, что письма перечислены между &lt; и &gt; тегом. Я пытаюсь использовать регулярное выражение для идентификации всех электронных писем и их печати. Однако при выполнении вместо того, чтобы извлекать электронные письма (по одному электронному письму на строку), весь файл печатается.

Как это исправить?

+1

Я не понимаю ваш код вообще. Почему вы используете 'urllib2' для открытия локального файла? Просто используйте 'open ("/path/to/file.html ") как f: soup = BeautifulSoup (f)'. Далее, что вы ожидаете от 'raw_input (soup)'? Наконец, почему вы выполняете регулярный поиск текста, когда вы только начинаете использовать парсер HTML? – MattDMo

+0

@MattDMo: Ах, да, вы правы, сэр. Возможно, просто открыл его. Не знаю, что raw_input берет вход пользователя. Я был в предположении, что он будет разбирать переменную супа в строку. Без строки raw_input появляется сообщение о том, что функция re.findall ожидает строку в качестве второго параметра в строке – Piyush

ответ

-1

Вы можете проанализировать тег, который вы ищете, используя find_all метод BeautifulSoup. Вот код. (Я сохраненный файл образца как a.html)

from bs4 import BeautifulSoup 
url = open("a.html",'r').read() 
soup = BeautifulSoup(url) 
rows = soup.find_all('tr') # find all rows using tag 'tr' 
for row in rows: 
    cols = row.find_all('td') # find all columns using 'td' tag 
    if len(cols)>1: 
     email_id_string = cols[1].text # get the text of second element of list (contains email id element) 
     email_id = email_id_string[ email_id_string.find("<")+1 : email_id_string.find(">") ] (get only the email id between <and>) 
     print email_id 
+0

Это не сработает, потому что существует множество элементов '', которые не содержат адресов электронной почты. – MattDMo

+0

Если присутствует идентификатор электронной почты, то он присутствует как второй столбец, поэтому я проверил, что с использованием 'if condition' – Tanu

+0

Нет у вас нет. Вы просто проверили, существует ли более одного '' элементов на '', и если это так, вы берете второй td и предполагаете, что он содержит электронное письмо, которое для произвольного HTML не является допустимым предположением. ОП опубликовал очень простой пример, хотя я считаю, что фактические данные не так хорошо структурированы, как это. Ваше решение должно быть * намного более надежным, чем в настоящее время. – MattDMo

1

Ваш пример действительно работает

re.findall(r'\&lt;(.*?)\&gt;',your_data_bump)= 
['[email protected]', '[email protected]', '[email protected]'] 
+0

Спасибо, что это действительно сработало. Я просто изменил эту строку в соответствии с = re.findall (r '< (. *?) >', str (email)), а затем распечатал значения. – Piyush

Смежные вопросы