2017-10-19 9 views
2

[OK]を、この本物の素早く編集し、ここに私のスクリプト全体を含めることにしました。htmlからpython webscraperに情報の特定のビットを引き出すにはどうすればよいですか?

これは私の最初の「実世界」アプリケーションです。これは、Pythonを使用しています。つまり、プログラミング言語です。 私は見つけたチュートリアルを使用して基本的なWebスクレーパーを構築しました。情報を追加して、それよりも有用なものを作成しようとしています。 私が抱えている問題は、集められた情報がこれまでのところ比較的簡単に得られたことですが、今ここでこのコードから価格を私のpythonスクリプトに引っ張っていきます。

私はここから価格を得ることができますが、コードの最後に.csvファイルが完全に破棄されるように、文字や空白を含むひどい書式設定になっています。

from bs4 import BeautifulSoup as soup 
from urllib.request import urlopen as uReq 

my_url = "https://www.newegg.com/Video-Cards-Video-Devices/Category/ID-38? 
Tpk=graphics%20cards" 

#Grabbing the page 
uClient = uReq(my_url) 

#Reading uCLient and saving contents as a variable called page_html (it is 
raw html code) 
page_html = uClient.read() 

#Close the web connection to uCLient 
uClient.close() 

#html parsing 
page_soup = soup(page_html, "html.parser") 

#Grabs graphics card containers/each product 
containers = page_soup.findAll("div",{"class":"item-container"}) 

filename = "products.csv" 

f = open(filename, "w") 

headers = "Brand, Product Name, Price, Shipping\n" 

f.write(headers) 


for container in containers: 

    brand = container.div.div.a.img["title"] 

    title_container = container.findAll("a",{"class":"item-title"}) 
    product_name = title_container[0].text 

    price_container = container.findAll("li",{"class":"price-current"}) 
    price = price_container[0].text.strip('|') 

    shipping_container = container.findAll("li",{"class":"price-ship"}) 
    shipping = shipping_container[0].text.strip() 

    print("Brand: " + brand) 
    print("Product name: " + product_name) 
    print("Price: " + price) 
    print("Shipping: " + shipping) 

    f.write(brand + "," + product_name.replace(",","|") + "," + price + "," 
    + shipping + "\n") 


f.close() 

shipping_containerを実行するとこのようになりますHTMLのビットは:

<li class="price-current"> 
    <span class="price-current-label"> 
    <a class="membership-info membership-popup" data-neg-popid="MembershipPopup" 
     href="javascript:void(0);" name="membership" style="display: inline"><span 
     class="membership-icon"></span><span style="display: none">|</span></a> 
    </span>$<strong>249</strong><sup>.99</sup> <a class="price-current-num" 
     href="https://www.newegg.com/Product/Product.aspx? 
     Item=N82E16814150795&amp;buyingoptions=New&amp;ignorebbr=1">(10 Offers)</a> 
    <span class="price-current-range"> 
    <abbr title="to">–</abbr> 
    </span> 
</li> 

あなたはおそらく今で考え出してきたように、私が欲しいのは唯一の249.99を表示するには、印刷(価格)のためです。私はここでねじれていますか?

これは私の実際の.csvファイルにインポートする内容である '| \ nは$ 249.99 \ XA0(10申し出)\ N \ N-'

または


| $ 249.99(19申し出)

-


は、ここに私が働いているlinkです。

男の子、正直言って、私は「私のためにやってください」と答えているのではなく、私が学ぶことができるものを探しています。私はちょうどここにコードがあります...が、エラーなしで、それは私がこのごちゃ混ぜ混乱を取得し、なぜ

>>> price = price_container[0].findAll('li',{'/span':'strong'}) 
>>> price 

OR

>>> price = price_container[0].findAll('li',{'strong':'strong'}) 
>>> price 

何も返さないということである理由を把握する

+0

? –

+0

BeautifulSoup4。 – user8628012

答えて

2

をしようとしていますあなたが提供したサンプルHTMLからデータをスクレイプする:

# We are using BeautifulSoup library for scraping. 
from bs4 import BeautifulSoup 

if __name__ == "__main__": 

    temp = 'REPLACE THIS STRING WITH THE ABOVE SAMPLE HTML' 

    # For using this in the real website, you can iterate over the lists with class 'price-current' 
    soup = BeautifulSoup(temp, 'html.parser') 
    dollars = soup.find("strong").text 
    cents = soup.find("sup").text 
    print(dollars + cents) 

ここにいくつかのクールなライブラリがありますあなたこするプロジェクトで使用:

  1. BeautifulSoup
  2. Scrapy
  3. Requests

注:そのウェブサイトからデータをこすり取る際には、法的である場合は、必ずチェックする必要があります。

+0

ありがとう、私は仕事に戻り、私はこの仕事をすることができるかどうかを確認する必要があります。 Sidenote:ウェブスクレイピングが違法である可能性があるとは考えていませんでした。それについての情報はありますか?なぜ、すでに公表されている情報を引っ張って問題を引き起こすのでしょうか? – user8628012

+0

違法である可能性があります(しかし、すべてのウェブサイトではありません)。例えば。 LinkedIn。あなたが困ってしまわないようにするには、そのウェブサイトのプライバシーポリシーをお読みください。 –

+0

ああ、大丈夫、私が理解できるようなソーシャルメディアを掻き集める。 – user8628012

0

このショットを投稿してください。それはあなたにもっときれいな方法で価格を与えるだけです。 Btw、上記のスクレーパーのhtml_elemが上記の貼り付けたhtml elementsの代替名だと考えてください。

from bs4 import BeautifulSoup 

soup = BeautifulSoup(html_elem,"lxml") 
print(''.join([item.text.strip() for item in soup.select("strong,sup") if item.text.split()])) 

結果:あなたが使用しているライブラリ

249.99 
+0

私は実際に私がここに投稿していたことを忘れて、それを更新する必要がありました。私はRedditから答えを得ました。そしてこれまでに一番うまく動作するものはあなたのものにかなり近いです。 今私は'私は下ごしらえをしているのですが、これまでのところ、これまでのものとはまったく異なる方法で価格を買わなければならないのです。 もし私が推測しなければならないのは、私が最初にやるべきことは、HTMLで何かを理解することが極端に欠けていることです – user8628012

関連する問題