0

次を含むログファイルがあります。

http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/
http://www.downloadray.com/windows/Photos_and_Images/Graphic_Capture/
http://www.downloadray.com/windows/Photos_and_Images/Digital_Photo_Tools/

私はこのコードを持っています:

from bs4 import BeautifulSoup
import urllib
import urlparse

f = open("downloadray2.txt")
g = open("downloadray3.txt", "w")

for line in f.readlines():
    i = 1
    while 1:
        url = line+"?page=%d" % i
        pageHtml = urllib.urlopen(url)
        soup = BeautifulSoup(pageHtml)

        has_more = 1
        for a in soup.select("div.n_head2 a[href]"):
            try:
                print (a["href"])
                g.write(a["href"]+"\n")
            except:
                print "no link"
        if has_more:
            i += 1
        else:
            break

このコードはエラーにはなりませんが、機能しません。修正してみましたが解決しません。しかし、このコードを試してみると、うまくいきます:

from bs4 import BeautifulSoup
import urllib
import urlparse

g = open("downloadray3.txt", "w")

url = "http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/"
pageUrl = urllib.urlopen(url)
soup = BeautifulSoup(pageUrl)

i = 1
while 1:
    url1 = url+"?page=%d" % i
    pageHtml = urllib.urlopen(url1)
    soup = BeautifulSoup(pageHtml)

    has_more = 2

    for a in soup.select("div.n_head2 a[href]"):
        try:
            print (a["href"])
            g.write(a["href"]+"\n")
        except:
            print "no link"
    if has_more:
        i += 1
    else:
        break

では、ログ テキスト ファイルから読み取れるようにするにはどうすればよいでしょうか。リンクをいちいち読んでもらうのは大変です。

4

1 に答える 1

1

行末から改行を削除しましたか?

for line in f.readlines():
    line = line.strip()

readlines()改行\n文字を含むファイルから取得した行のリストを生成します。

証拠url変数を印刷することによる証拠(行の後url = line+"?page=%d" % i):

元のコード:

http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/
?ページ=1
http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/
?ページ=2
http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/
?ページ=3

私の提案した修正で:

http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/?page=1
http://www.downloadray.com/TIFF-to-JPG_download/
http://www.downloadray.com/Moo0-Image-Thumbnailer_download/
http://www.downloadray.com/Moo0-Image-Sizer_download/
http://www.downloadray.com/Advanced-Image-Viewer-and-Converter_download/
http://www.downloadray.com/GandMIC_download/
http://www.downloadray.com/SendTo-Convert_download/
http://www.downloadray.com/PNG-To-JPG-Converter-Software_download/
http://www.downloadray.com/Graphics-Converter-Pro_download/
http://www.downloadray.com/PICtoC_download/
http://www.downloadray.com/Free-Images-Converter_download/
http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/?page=2
http://www.downloadray.com/VarieDrop_download/
http://www.downloadray.com/Tinuous_download/
http://www.downloadray.com/Acme-CAD-Converter_download/
http://www.downloadray.com/AAOImageConverterandFTP_download/
http://www.downloadray.com/ImageCool-Converter_download/
http://www.downloadray.com/GeoJpeg_download/
http://www.downloadray.com/Android-Resizer-Tool_download/
http://www.downloadray.com/Scarab-Darkroom_download/
http://www.downloadray.com/Jpeg-Resizer_download/
http://www.downloadray.com/TIFF2PDF_download/
http://www.downloadray.com/windows/Photos_and_Images/Image_Convertors/?page=3
http://www.downloadray.com/JGraphite_download/
http://www.downloadray.com/Easy-PNG-to-Icon-Converter_download/
http://www.downloadray.com/JBatch-It!_download/
http://www.downloadray.com/Batch-It!-Pro_download/
http://www.downloadray.com/Batch-It!-Ultra_download/
http://www.downloadray.com/Image-to-Ico-Converter_download/
http://www.downloadray.com/PSD-To-PNG-Converter-Software_download/
http://www.downloadray.com/VectorNow_download/
http://www.downloadray.com/KeitiklImages_download/
http://www.downloadray.com/STOIK-Smart-Resizer_download/

更新

繰り返しますが、このコードは期待どおりに実行されません。変数が変更されないため、whileループが続行されないからです。has_more

`soup.select(...)` によって返されるリストが空の場合、これ以上リンクがないことがわかります。空かどうかは len(...) で確認できます。したがって、その部分は次のようになります。
    list_of_links =soup.select("div.n_head2 a[href]")
    len(list_of_links)==0 の場合:
        壊す
    そうしないと:
        soup.select("div.n_head2 a[href]") の a の場合:
            印刷 (a["href"])
            g.write(a["href"]+"\n")
        私は += 1

最大ページ数を超えてクエリが実行された場合、ページには利用可能な最新のページが引き続き表示されるようです。したがって、使用可能な最大ページ数が 82 で、83 ページをクエリすると、82 ページが返されます。このケースを検出するには、前のページの URL のリストを保存し、それを現在の URL のリストと比較します。

これが完全なコードです(テスト済み):

from bs4 import BeautifulSoup
import urllib
import urlparse

f = open("downloadray2.txt")
g = open("downloadray3.txt", "w")

for line in f.readlines():
    line = line.strip()
    i = 1
    prev_urls = []
    while 1:
        url = line+"?page=%d" % i
        print 'Examining %s' % url
        pageHtml = urllib.urlopen(url)
        soup = BeautifulSoup(pageHtml)

        list_of_urls = soup.select("div.n_head2 a[href]")
        if set(prev_urls)==set(list_of_urls):
            break
        else:
            for a in soup.select("div.n_head2 a[href]"):
                print (a["href"])
                g.write(a["href"]+"\n")
            i += 1
            prev_urls = list_of_urls
于 2013-10-09T06:42:51.063 に答える