2013-02-15 1 views
0

웹 사이트에서 일부 정보를 다 써 버리려합니다. 저는 8 필드의 정보가 필요합니다. 나는 5 필드를 갖지만, 3 필드는 항상 비어 있습니다. 제 정규 표현식에 실수가 있다고 생각합니다. 파이썬으로하고 있는데 BS를 사용할 필요가 없습니다. 다음은 내가 긁을 필요가있는 HTML 파일입니다. 이것은 웹 페이지 중 하나의 예입니다. 여기 파이썬에서 웹 스크래핑을위한 정규 표현식의 오류가 발생했습니다.

enter code here 

<td><span class="facultyName">John Matthew Falletta, MD</span> 

<span class="primaryTitle">Professor of Pediatrics</span> 

<span class="secondaryTitle">Professor in the School of Nursing</span> 

<td><span class="label">Department:</span> 
     &nbsp;&nbsp; 
    </td><td>Pediatrics</td> 

<td><span class="label">Division:</span> 
     &nbsp;&nbsp; 
    </td><td>Hematology/Oncology</td> 

<td><span class="label">Address:</span></td><td>Box 2991<br>DUMC<br>Durham, NC &nbsp;27710 </td> 

<td><span class="label">Phone:</span></td><td> 
     (919) 
     668-5111<br> 

<td><span class="label">FAX:</span></td><td>     
     (919) 
     688-5125</td> 

태그의 종류마다 각각의 정규 표현식을 포함하는 내 코드입니다 :

enter code here 

patFinderFullname = re.compile('<span class="facultyName">(.*)</span>') 
patFinderPTitle = re.compile('<span class="primaryTitle">(.*)</span>') 
patFinderSTitle = re.compile('<span class="secondaryTitle">(.*)</span>') 
patFinderDepartment = re.compile('<span class="label">Department:</span>\s+&nbsp;&nbsp;\s+</td><td>(.*)</td>') 
patFinderDivision = re.compile('<span class="label">Division:</span>\s+&nbsp;&nbsp;\s+</td><td>(.*)') 

patFinderAddress = re.compile(' <span class="label">Address:</span>\s+(.*)\s+</td>') 
patFinderPhone = re.compile('<span class="label">Phone:</span></td><td>\s*(.*?)\s*<br>') 
patFinderFax = re.compile('<td><span class="label">FAX:</span>\s+</td><td>\s+(.*)</td>') 

처음 다섯 개 필드 결과는 올바른오고 있지만, 주소, 전화 및 팩스의 마지막 세 필드는 항상 반환하는 빈. 아무도 내가 누락 된 부분을 지적 할 수 있습니까? 아니면 마지막 세 필드의 정규 표현식에 문제가 있습니까? 나는 이전의 [1] [질문]을 올렸지 만,이 문제는 나중에 그것에 도착 했으므로 나는 다른 질문으로 그것을 묻습니다. [1]

: How to scrape html tags spread over multiple lines in python?

+0

부서 're.compile()'에 닫기 괄호가 없습니다. 실제로 표현의 끝은 전혀 보이지 않습니다. 닫는 '') ' –

+0

죄송합니다. DIvision에 놓친 경우, 오타가되어야합니다. 지난 3 개의 입력란, 즉 주소, 전화 및 팩스에서 확답을 얻고 있습니다. – Steve

+2

HTML 파서를 사용하지 않는 이유는 무엇입니까? –

답변

1
patFinderAddress = re.compile('<td><span class="label">Address:</span></td>.*?</td>' 
patFinderPhone = re.compile('<td><span class="label">Phone:</span>\s*</td><td>\s*^\s*.*\s*^\s*.*<br>',re.M) 
patFinderFax = re.compile('<td><span class="label">FAX:</span>\s*</td><td>\s*^\s*.*\s*^\s*.*</td>',re.M) 

여기에 데이터와 함께 작업하는 몇 가지 정규식 등에서 특정 요소를 뽑아 오기입니다. 마지막 두 개는 데이터가 여러 줄에 걸쳐 있기 때문에 작동하지 않았습니다. 첫 번째 오류는 잘못되어 작동하지 않았습니다.

그러나 html 구문 분석의 경우 HTML 구문 분석기를 사용하면 훨씬 강력하고 HTML 문자열의 눈에 띠기보다는 원하는 데이터를 얻을 수 있습니다.

+0

나는 BS 사용법을 배우는 법을 배웁니다. 나는 위의 정규식을 시도, 그들은 모든 태그를 포함한 전체 데이터를 표시하고 있습니다. – Steve

+0

그래서 당신의 정규식입니다! 데이터 만 원한다면 파서를 사용하십시오. 지옥에서 나는 파서 직업을하기 위해 정규 표현식을 만들고있다. –

+0

저는이 말을 처음 접했으므로 쉽고 쉬운 것을 알지 못했습니다. 좋아, 나는 BS를 배우고 사용할 것이다. 시간 내 줘서 고마워. – Steve