2

次のようなページにハイパーリンクを追加するという、ほぼ毎月発生するタスクを自動化しようとしています。

2013: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2012: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2011: Jan Feb Mar ...

その月の新しいドキュメントを取得するたびに、

<a href="document_001.pdf">Jul</a>

その周りのタグ。

だから私はPythonでBeautifulSoupを使っています。以下で、このデータを含む HTML の「p」タグを選択し、最初に見つかった月に replace() を実行していることがわかります (作成した逆引き辞書を使用して Month を検索し、replace( の 3 番目のパラメーターを使用します)。 ) は、最初に見つかったもののみを実行することを示します)。

# Modify link in hr.php:
hrphp = open('\\\\intranet\\websites\\infonet\\hr\\hr.php', 'r').read()
soup = BeautifulSoup(hrphp) # Parsing with BeautifulSoup
Months = {k: v for k,v in enumerate(calendar.month_abbr)} # Creates a reverse dictionary for month abbreviation lookup by month number, ie. "print Months[07]" will print "Jul"

print hrphp+"\n\n\n\n\n"  # DEBUGGING: Compare output before
hrphp = hrphp.replace(
    str(soup.findAll('p')[4]), 
    str(soup.findAll('p')[4]).replace(
        Months[int(InterlinkDate[1][-5:-3])], 
        "<a href=\""+FilenameNewsletter+"\">"+Months[int(InterlinkDate[1][-5:-3])]+"</a>", 
        1), 
    1
)
print hrphp # DEBUGGING: Compare output after

ネストされた replace() であることがわかりますか? ロジックは正常に機能しているように見えますが、何らかの理由で実際には値が変更されません。スクリプトの前半で、ページのセグメントで Months[] ディクショナリと str.replace() で同様のことを行いましたが、これはうまくいきますが、このような入れ子になった replace() はなく、検索もしませんsoap.findAll() を使用したテキストのブロック。

机の上で頭をぶつけ始めましたが、助けていただければ幸いです。前もって感謝します。

4

1 に答える 1

1

コードで最終的に行うことstr(soup.findAll('p')[4]).replaceは、 の結果の文字列表現で見つかった値を置き換えるだけです。これは、解析後に「美しいスープが Unicode を提供する」ためsoup.findAll('p')[4]、 の文字列とは異なる可能性が高くなります。hrphp

Beautiful Soups のドキュメントに答えがあります。属性値の変更セクションを見てください。

于 2013-07-03T15:13:09.003 に答える