2017-11-07 5 views
2

저는 python으로 일부 요소의 전화 번호와 주소를 가져 오는 스크립트를 작성했습니다. 문제는 내가 전화 번호를 구문 분석하려고 시도한 방식이 확실히 지저분한 것입니다. 나는 주소에 대해서도 똑같이 할 수있다. 그러나 더 깨끗하고 좋은 방법이 있습니까? 데이터가 포함되어있는 내전화 번호와 주소를 구문 분석 할 수 없습니다.

요소 : 그건 그렇고

(330)971-7456 

:

from lxml.html import fromstring 

tree = fromstring(html_content) 
phone = ' '.join([elem.text_content().strip().split()[-2] for elem in tree.cssselect("div")]) 
phone1 = ' '.join([elem.text_content().strip().split()[-1] for elem in tree.cssselect("div")]) 
print(phone+phone1) 

결과 :

html_content=''' 
    <div style=""> 
     <strong>Pamela Banchy, Chief Information Officer</strong> 
      <br>Western Reserve Hospital<br> 
      <br>Lyndhurst, OH <br> 
       <a href="mailto:[email protected]">[email protected]</a> 
      <br>(330) 971-7456<br> 
    </div> 
    ''' 

표현 및 스크립트 나는 전화 번호를 구문 분석하는 데 사용했습니다 , 주소는 Lyndhurst, OH이고 전화 번호는 (330)971-7456입니다. ady는 지저분한 방식으로 움켜 쥐었다.

+0

는 정보, 아니면 그냥이 하나를 추출하기 위해 많은 유사한 태그가 있습니까? – Reti43

+0

많은 유사한 br 태그가 있지만 일반적인 것은 전화 번호가 마지막 위치에 있고 주소가 세 번째로 마지막에 있음을 나타냅니다. – SIM

답변

0

텍스트를 줄 바꿈으로 나눌 수 있으므로 최소한의 사후 처리만으로 편리하게 주소와 전화 번호를 가져올 수 있습니다. 당신이 그것을 할 수

for elem in tree.cssselect('div'): 
    elem = elem.text_content().split('\n') 
    address = elem[-4].strip() 
    phone = elem[-2].replace(' ', '') 
+0

나는 당신이 나에게 보여 줬던 이유 때문에 그것을 받아 들일 것이다. 나는 그것을 하나의 라이너로 만들 생각을 가지고있다. tree.cssselect ("div")])의 elem에 대해서는'.join ([elem.text_content(). strip(). split ('\ n') [- 3]' 'phone = ' tree.cssselect ("div")])의 elem에 대해 .join ([elem.text_content(). strip(). split ('\ n') [- 1] – SIM

+1

@Shahin 각 div 태그에서 주소와 전화 번호를 개별적으로 추출하려고한다고 가정했습니다. 한사람이 모든 주소와 모든 전화 번호를 연결합니다. 그것이 당신이 원하는 것이라면 괜찮습니다. 그런데 주소 자체에 공백이 포함될 수있는 경우 공백으로 주소를 연결하는 것이 좋습니다. – Reti43

+0

Reti43에게 감사의 말을 전합니다. – SIM

0

더 구체적인 CSS 선택기를 사용해 볼 수 있습니다. tree.cssselect("div")에 의해 반환 된 값을 조작하는 대신, 당신은 당신의 텍스트를 액세스 할 때, 이는 반환해야한다 "(330) 971-7456를"

tree.cssselect("div > br:nth-child(3)") 

를 사용할 수 있습니다. > 님이 상위 요소에 액세스합니다 (예 : div > br은 부모가 <div> 요소 인 모든 <br> 요소를 선택하고 "3"은 부모의 세 번째 자식을 지정합니다. 자세한 내용은 here을 참조하십시오.

이 간단한 경우에는 작동하지만 div > br:nth-child(3)으로 지정된 여러 요소가있는 경우, 즉 의 두 그룹이 <div> 인 경우 문제가 발생할 수 있습니다. 이 경우 CSS 선택기는 여러 값 (목록 등)을 반환해야하며 모든 값을 반복하고 각 전화 번호를 추출해야합니다. 면책 조항 : 나는 lxml.html 라이브러리를 사용하지 않았으며 cssselect()의 예상 기능을 조사하지 않았으므로 여기서 보장하지 않습니다.

+0

선택자가 이해가되지 않습니다. 그래도 고마워! – SIM

+0

HTML 코드를 조금 더 살펴본 후에도 약간의 설명이 필요하다는 것을 깨달았습니다. 예를 들어, '
HI THERE
'자체는 의미가 없습니다. '
HI THERE
'이어야합니다. 들여 쓰기가 혼란 스럽다는 것을 깨닫고 CSS 선택기를 편집했습니다. 보다 명확한 예를 제공해주십시오! – musikreck

+0

실렉터를보기가 정말 혼란 스럽습니다. 어떻게 br 태그를 기반으로 셀렉터를 만들 수 있습니까? 줄 바꿈이야. – SIM

0

더 좋은 방법은 xpath를 사용하는 것입니다. address, phone = tree.xpath('./div/br/text()')[-2:]

1

또 다른 방법 :

text_nodes = [node for node in tree.cssselect('div')[0].itertext() if node.split()] 
adress, phone = text_nodes[2], text_nodes[4] 
+0

이 스타일은 저에게 아주 새로운 것입니다. 네, 그 일을합니다. 고마워요. – SIM

+1

이 경우 솔루션이 가장 좋습니다. 두 줄의 코드 만 5 개의 개별 결과를 가져올 수 있습니다. 다시 한 번 감사드립니다. – SIM

+0

5 개의 텍스트 노드를 모두 5 개의 다른 변수에 할당하려면'name, work, address, email, phone = text_nodes' 구문을 사용할 수 있습니다. – Andersson