2017-11-21 17 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']は、私が扱う必要があるリンクを含む行です。いくつかのエントリは単一のリンクを含み、いくつかは多くのエントリを含みます。

この(https://github.com/python-openxml/python-docx/issues/74)はPython-DOCXのための文書化方法ごとにハイパーリンクを追加する機能である:私はそれを行うには考え

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 

方法は、それぞれのハイパーリンクを反復処理するためのループを使用していましたそれぞれの段落にハイパーリンクがうまくいくはずです。私は以下を試みたが、これはちょうど正しく動作しないリンクの1000を作成します。

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

次のように私は、現在のデータのちょうど2つのセットで非常に小さい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 
: 
... 

あなたが見ることができるように、ループが繰り返さ茶のために反復可能として文字列値を使用して文字列のラクタ。これは、「関連項目」のそれぞれの行を分割

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ファイルからいくつかの行を投稿するために使用しています。問題は、[参照]行が複数行になっている場合があるため、リスト内のすべての後続リンクのハイパーリンクとして最初の項目を適用していることが原因と考えられます。[ '参照'] \t \tリンク=行リンク内のアイテムの分割( "の\ n") \t \t:csv_rowsにおける行の : –

+0

私は次のコードで、今問題を修正している。 \tを\t \t p = document.add_paragraph() \t \t \tハイパーリンク= add_hyperlink(p、item、item) –

0
問題考え出し

し、次のコード問題を解決:私はあなたの代わりに必要だと思う何

のようなものがあります行をリストに入れた後、このリストは各項目がハイパーリンクになるまで繰り返されます。

関連する問題