0

一連の .html ファイルからすべての内部リンクを削除したいと考えています。基本的な考え方は、で始まるものはすべて<a href=リンクであり、で始まらない<a href="http場合は内部リンクであるということです。

これを実現するために、小さな Python スクリプトを作成しようとしています。これで、各ファイルの前半は完全に処理されますが、同じリンクで一貫してクラッシュします。明らかにタイプミスや欠落をチェックしまし</a>たが、何も表示されません。スクリプトを再実行すると、「問題のリンク」は削除されますが、そのまま残ります。スクリプトを再実行する</a>と、ますます多くのリンクが削除されるようですが、すべての内部リンクを 1 回の実行で切り捨てたいと思います。

私が間違っていることを誰かが提案していますか?私が使用しているコードについては、以下を参照してください。

tList = [r"D:\@work\projects_2013\@websites\pythonforspss\a44\@select-variables-having-pattern-in-names.html"]
for path in tList:
    readFil = open(path,"r")
    writeFil = open(path[:path.rfind("\\") +1] + "@" + path[path.rfind("\\") + 1:],"w")
    flag = 0
    for line in readFil:
        for ind in range(len(line)):
            if flag == 0:
                try:
                    if line[ind:ind + 8].lower() == '<a href=' and line[ind:ind + 13].lower() != '<a href="http':
                      flag = 1
                      sLine = line[ind:]
                      link = sLine[:sLine.find(">") + 1]
                      line = line.replace(link,"")
                      print link
                except:
                    pass
            if flag == 1:
                try:
                    if line[ind:ind + 4].lower() == '</a>':
                        flag = 0
                        line = line.replace('</a>',"")
                        print "</a>"
                except:
                    pass
        writeFil.write(line)
    readFil.close()
    writeFil.close()
4

2 に答える 2

1

BeautifulSouplxmlなどの HTML パーサーを使用します。lxmlを使用すると、次のようなことができます。

import lxml.html as LH

url = 'http://stackoverflow.com/q/15186769/190597'
doc = LH.parse(url)

# Save a copy of the original just to compare with the altered version, below
with open('/tmp/orig.html', 'w') as f:
    f.write(LH.tostring(doc))

for atag in doc.xpath('//a[not(starts-with(@href,"http"))]'):
    parent = atag.getparent()
    parent.remove(atag)

with open('/tmp/altered.html', 'w') as f:
    f.write(LH.tostring(doc))

BeautifulSoupに相当するものは次のようになります。

import bs4 as bs
import urllib2

url = 'http://stackoverflow.com/q/15186769/190597'
soup = bs.BeautifulSoup(urllib2.urlopen(url))

with open('/tmp/orig.html', 'w') as f:
    f.write(str(soup))

for atag in soup.find_all('a', {'href':True}):
    if not atag['href'].startswith('http'):
        atag.extract()

with open('/tmp/altered.html', 'w') as f:
    f.write(str(soup))
于 2013-03-03T14:45:45.173 に答える