2017-11-21 24 views
0

저는 CSV 출력 파일을 가져 와서 데이터를 다시 포맷하고 Python-DocX를 사용하여 Word 문서에 넣는 Python 프로젝트에서 작업하고 있습니다. 지금까지 모든 것이 훌륭하게 작동하지만 같은 필드에서 여러 개의 하이퍼 링크로 작업하면 모든 링크가 세트의 첫 번째 링크를 가리 킵니다.CSV 필드 가져 오기 및 별도의 Python-DocX 단락 링크 추출

현재이 문제를 일으키는 코드입니다 :

 p7 = document.add_paragraph() 
     hyperlink = add_hyperlink(p7, row['See Also'], str(row['See Also'])) 

당신이 빈 단락이 초기화 된 후 하이퍼 링크가 할당되어 볼 수 있듯이. row [ 'See Also']는 함께 작업해야하는 링크가 포함 된 행입니다. 일부 항목은 단일 링크를 포함하고 일부 항목은 많은 링크를 포함합니다.

def add_hyperlink(paragraph, url, text): 
    # This gets access to the document.xml.rels file and gets a new relation id value 
    part = paragraph.part 
    r_id = part.relate_to(
     url, docx.opc.constants.RELATIONSHIP_TYPE.HYPERLINK, 
     is_external=True 
    ) 

    # Create the w:hyperlink tag and add needed values 
    hyperlink = docx.oxml.shared.OxmlElement('w:hyperlink') 
    hyperlink.set(docx.oxml.shared.qn('r:id'), r_id,) 

    # Create a w:r element 
    new_run = docx.oxml.shared.OxmlElement('w:r') 

    # Create a new w:rPr element 
    rPr = docx.oxml.shared.OxmlElement('w:rPr') 

    # Join all the xml elements together add add the required text to the w:r element 
    new_run.append(rPr) 
    new_run.text = text 
    hyperlink.append(new_run) 

    paragraph._p.append(hyperlink) 

    return hyperlink 

I가 각 하이퍼 링크를 통해 반복 루프를 사용하는 것이었다 할 생각 방법 :

이 (https://github.com/python-openxml/python-docx/issues/74)는 파이썬 DOCX위한 기록 방법에 따라, 하이퍼 링크를 추가 함수 각각의 단락에 하이퍼 링크가 잘 작동하도록해야합니다. 나는 다음을 시도했다. 그러나 이것은 바로 작동하지 않는 링크의 1000 's를 만든다.

for x in row['See Also']: 
    p = document.add_paragraph() 
    hyperlink = add_hyperlink(p, row['See Also'], row['See Also']) 
다음과 같이 나는 현재 데이터의 두 세트 아주 작은 CSV 파일을 테스트하고 있습니다

:

물론
https://www.openssl.org/blog/blog/2016/08/24/sweet32/ 

이 더 문제가 발생하지 않습니다 및 하이퍼 링크가 예상 작품으로, 그러나 다음 모든 링크가 첫 번째 주소를 가리 키도록 만듭니다.

https://downloads.avaya.com/elmodocs2/security/ASA-2006-217.htm 
http://www.kb.cert.org/vuls/id/JARL-5ZQR4D 
http://www-01.ibm.com/support/docview.wss?uid=isg1IY55949 
http://www-01.ibm.com/support/docview.wss?uid=isg1IY55950 
http://www-01.ibm.com/support/docview.wss?uid=isg1IY62006 
http://www.juniper.net/support/security/alerts/niscc-236929.txt 
http://technet.microsoft.com/en-us/security/bulletin/ms05-019 
http://technet.microsoft.com/en-us/security/bulletin/ms06-064 
http://www.kb.cert.org/vuls/id/JARL-5YGQ9G 
http://www.kb.cert.org/vuls/id/JARL-5ZQR7H 
http://www.kb.cert.org/vuls/id/JARL-5YGQAJ 
http://www.nessus.org/u?cf64c2ca 
https://isc.sans.edu/diary.html?date=2004-04-20 

수정 사항은 매우 간단합니다.이 문제와 관련된 도움을 주시면 감사하겠습니다.

답변

0

당신은 세부 사항을 보여 상황에 맞는 코드를 충분히 제공하지 않은,하지만 난 당신의 문제는 줄을 의심 : 당신이 실행하는 경우

for x in row['See Also']: 

:

for x in row['See Also']: 
    print x 

내가 당신을 생각 '얻을 것이다 :

h 
t 
t 
p 
s 
: 
... 

당신이 볼 수 있듯이, 루프 반복 (Iteration) 차에 대한의 반복 가능한 같은 문자열 값을 사용하여 문자열 racters. 이것은 '관련 항목'의 각 행을 분할

for row in csv_rows: 
     links = row['See Also'].split("\n") 
     for item in links: 
      p = document.add_paragraph() 
      hyperlink = add_hyperlink(p, item, item) 

:

for row in csv_rows: 
    p = document.add_paragraph() 
    hyperlink = add_hyperlink(p, row['See Also'], row['See Also']) 
+0

제안하신 내용은 현재 사용하고있는 것과 같은 방법으로, 현재 입력으로 사용하는 CSV 파일에서 여러 행을 게시하는 데 사용하고 있습니다. 이 문제는 어떤 경우에는 See Also 행이 여러 줄로 표시되어 목록의 모든 후속 링크에 대한 첫 번째 항목을 하이퍼 링크로 적용하고있는 것으로 보입니다. –

+0

나는 다음과 같은 코드로, 지금은 문제를 해결 한 : 행에 대해 을 csv_rows에 : \t \t 링크 = 행을 [ '참조'] 분할 ("\ n")를 링크의 항목에 대한 \t \t :. \t을 \t \t p = document.add_paragraph() \t \t \t 하이퍼 링크 = add_hyperlink (p, item, item) –

0
문제 파악

다음과 같은 코드 문제를 해결 : 난 당신이 대신해야한다고 생각 무엇

같은 뭔가가 행을 목록에 넣은 다음이 목록은 각 항목이 하이퍼 링크로 바뀌면서 반복됩니다.