2013-05-13 1 views
0

먼저 파이썬을 처음 접했습니다. 오프라인 웹 사이트에서 연락처 정보를 긁어내어 CSV로 정보를 출력하려고합니다. 가능한 경우 HTML, HTML, 전자 메일, 전화 번호, 위치 데이터를 포함하는 페이지 URL을 가져오고 싶습니다. 모든 이름, 모든 전화 번호 및 HTML 사이트가있는 경우 태그 줄을 가져오고 싶습니다.* 업데이트 : python/beautifulsoup으로 html을 파싱하는 방법


업데이트 # 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

일반적으로 페이지 HTML에서 페이지 URL을 가져올 수 없습니다. 가져 오기 시간에 저장해야합니다. 나머지는 ... 파서의 잘못된 점을 알려주기 위해 샘플 데이터를 볼 필요가 있습니다. – 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' 

당신은 아마 오히려 f보다는 soup 객체의 메소드를 호출합니다. BeautifulSoup.find는 수프의 "하위 트리"를 반환합니다.이 트리는 정확히 여기에서 문자열로 나타 내기를 원합니다.

그러나 샘플 입력 없이는 테스트 할 수 없으므로 코드에서 유일한 문제는 아닙니다.

한편 이와 같은 문제가 발생하면 중간 값을 인쇄 해보십시오. fheadlineheadline2을 인쇄하십시오. 왜 headline3이 잘못된지 훨씬 더 분명합니다.


는 그냥 find 통화에서 soup으로 f을 교체하고, http://bendoeslife.tumblr.com/about 지금 작동하는 샘플 파일에 대해 실행하여 들여 쓰기 오류를 수정.

그러나 모든 유용한 기능을 수행하지는 않습니다. 파일에 h2 태그가 없으므로 headlineNone으로 끝납니다. 그리고 대부분의 다른 분야에서도 마찬가지입니다. 인 항목은 url입니다. 빈 문자열을 찾으려고하기 때문에 무언가가이라는 것을 찾을 수 있습니다. 세 가지 다른 파서로, 나는 <p>about</p> 또는 <html><body><p>about</p></body></html><html><body></body></html> ... 당신은 실제로 당신이 그것을 유용 아무것도 할 수 있기 전에 구문 분석하려는 파일의 구조를 이해할 필요가

를 얻을.이 경우 예를 들어 이메일 주소가 있지만 "Email"이라는 제목의 <a> 요소에 id"email"<li> 요소가 있습니다. 따라서, 당신은 그 기준 중 하나 또는 실제로 일치하는 다른 기준에 따라 그것을 찾기위한 찾기를 작성해야합니다.

관련 문제