1

この Web サイトhttp://tweakers.netからスマートフォンの価格を取得したいと考えています。オランダのサイトです。問題は、価格が Web サイトから収集されないことです。

テキストファイル「TweakersTelefoons.txt」には、次の 3 つのエントリが含まれています。

samsung-galaxy-s6-32gb-zwart

lg-nexus-5x-32gb-zwart

huawei-nexus-6p-32gb-zwart

私はpython 2.7を使用していますが、これは私が使用したコードです:

import urllib
import re

symbolfile = open("TweakersTelefoons.txt")
symbolslist = symbolfile.read()
symbolslist = symbolslist.split("\n")

for symbol in symbolslist:
    url = "http://tweakers.net/pricewatch/[^.]*/" +symbol+ ".html"
## http://tweakers.net/pricewatch/423541/samsung-galaxy-s6-32gb-zwart.html  is the original html

    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()

    regex = '<span itemprop="lowPrice">(.+?)</span>'
## <span itemprop="lowPrice">€ 471,95</span>  is what the original code looks like
    pattern = re.compile(regex)
    price = re.findall(pattern, htmltext)

    print "the price of", symbol, "is ", price

出力:

samsung-galaxy-s6-32gb-zwart の価格は []

lg-nexus-5x-32gb-zwart の価格は []

huawei-nexus-6p-32gb-zwart の価格は []

価格は表示されません [^.] を使用してユーロ記号を削除しようとしましたが、うまくいきませんでした。

さらに、ヨーロッパでは「.」の代わりに「,」を使用する場合があります。小数点の区切りとして。助けてください。

前もって感謝します。

4

2 に答える 2

1
import requests

from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get("http://tweakers.net/categorie/215/smartphones/producten/").content)

print [(p.a["href"], p.a.text) for p in soup.find_all("p",{"class":"price"})]

To get all the pages:

from bs4 import BeautifulSoup

# base url to pass page number to 1-69 in this case
base_url = "http://tweakers.net/categorie/215/smartphones/producten/?page={}"
soup = BeautifulSoup(requests.get("http://tweakers.net/categorie/215/smartphones/producten/").content, "lxml")

# get and store all prices and phone links
data = {1: (p.a["href"], p.a.text) for p in soup.find_all("p", {'class': "price"})}

pag = soup.find("span", attrs={"class":"pageDistribution"}).find_all("a")

# last page number
mx_pg = max(int(a.text) for a in pag if a.text.isdigit())

# get all the pages from the second to  mx_pg 
for i in range(2, mx_pg + 1):
    req = requests.get(base_url.format(i))
    print req
    soup = BeautifulSoup(req.content)
    data[i] = [(p.a["href"], p.a.text) for p in soup.find_all("p",{"class":"price"})]

You will need both requests, BeautifulSoup. The dict has the links to each phones page that you can visit if you want to scrape more data.

于 2016-02-07T19:46:03.520 に答える
0

I think that your problem is that you are expecting a web server to resolve a wildcard within a URL with "http://tweakers.net/pricewatch/[^.]*/ and you are not checking the returned code which I suspect is 404.

You need to either identify the product ID if that is fixed or post a search request using the forms post method.

于 2016-02-07T19:45:57.617 に答える