2013-05-13 2 views
0

Во-первых, я довольно новичок в Python. Я пытаюсь очистить контактную информацию от автономных веб-сайтов и вывести информацию в csv. Я хотел бы захватить URL-адрес страницы (не уверен, как это сделать из html), адрес электронной почты, телефон, данные о местоположении, если это возможно, любые имена, любые номера телефонов и строку тега для html-сайта, если он существует.* Обновление: как разобрать html с помощью python/beautifulsoup


Обновлено # 2 Код:

import os, csv, re 
from bs4 import BeautifulSoup 

topdir = 'C:\\projects\\training\\html' 
output = csv.writer(open("scrape.csv", "wb+")) 
output.writerow(["headline", "name", "email", "phone", "location", "url"]) 
all_contacts = [] 

for root, dirs, files in os.walk(topdir): 
    for f in files: 
     if f.lower().endswith((".html", ".htm")): 
      soup = BeautifulSoup(f) 

      def mailto_link(soup):   
      if soup.name != 'a': 
       return None 
      for key, value in soup.attrs: 
       if key == 'href': 
        m = re.search('mailto:(.*)',value) 
       if m: 
        all_contacts.append(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) 
      output.writerow([all_contacts]) 

print "Finished" 

Этот вывод в настоящее время не ничего, кроме заголовков строк возврата. Что мне здесь не хватает? Это должно по крайней мере вернуть некоторую информацию из html-файла, который находится на этой странице: http://bendoeslife.tumblr.com/about

+0

Обычно вы не можете получить URL-адрес страницы со страницы HTML; вам нужно сохранить это при выборе времени. Что касается остальных ... нам нужно увидеть некоторые примеры данных, чтобы рассказать вам, что не так с вашим парсером. – abarnert

ответ

1

Здесь есть (по крайней мере) две проблемы.

Во-первых, f - это имя файла, а не содержимое файла, или суп из этих материалов. Итак, f.find('h2') найдет 'h2' в имени файла, что не очень полезно.

Во-вторых, большинство методов find (включая str.find, что вы вызываете) возвращают индекс, а не подстроку. Вызов str по этому индексу просто даст вам строчную версию номера. Например:

>>> s = 'A string with an h2 in it' 
>>> i = s.find('h2') 
>>> str(i) 
'17' 

Таким образом, ваш код делает что-то вроде этого:

>>> f = 'C:\\python\\training\\offline\\somehtml.html' 
>>> headline = f.find('h2') 
>>> str(headline) 
'-1' 

Вы, вероятно, хотите, чтобы вызывать методы soup объекта, а не f. BeautifulSoup.find возвращает «поддерево» супа, которое именно то, что вы хотите подчеркнуть здесь.

Однако невозможно проверить это без ввода образца, поэтому я не могу обещать, что это единственная проблема в вашем коде.

Между тем, когда вы застряли с чем-то подобным, вы должны попробовать распечатать промежуточные значения. Распечатайте f и headline и headline2, и это будет гораздо более очевидным, почему headline3 неправ.


Просто заменив f с soup в find вызовов и фиксируя свою ошибку отступа, работает против вашего файла образца http://bendoeslife.tumblr.com/about сейчас работает.

Однако он не делает ничего полезного. Поскольку в файле нет h2, headline заканчивается как None. То же самое касается большинства других полей. Единственное, что делает найти что-нибудь url, потому что вы просите его найти пустую строку, которая найдет что-то произвольно. С тремя различными анализаторами, я получаю <p>about</p> или <html><body><p>about</p></body></html> и <html><body></body></html> ...

Вы должны действительно понять структуру файла, который вы пытаетесь разобрать, прежде чем делать что-нибудь полезное с ним.В этом случае, например, есть адрес электронной почты, но он находится в элементе <a> с заголовком "Email", с элементом <li> с id"email". Итак, вам нужно написать находку, чтобы найти ее на основе одного из этих критериев или чего-то еще, что она действительно соответствует.

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