1. ホーム
  2. python

[解決済み] BeautifulSoupです。find_all()とunicodeの問題?

2022-02-16 20:19:50

質問

BeautifulSoupを使って、Craigslistのページ上のすべての広告を取得するwebscraperを構築しているところです。以下は、私がこれまでに得たものです。

import requests
from bs4 import BeautifulSoup, SoupStrainer
import bs4

page = "http://miami.craigslist.org/search/roo?query=brickell"
search_html = requests.get(page).text

roomSoup = BeautifulSoup(search_html, "html.parser")

ad_list = roomSoup.find_all("a", {"class":"hdrlnk"})
#print ad_list
ad_ls = [item["href"] for item in ad_list]
#print ad_ls
ad_urls = ["miami.craigslist.org" + ad for ad in ad_ls]
#print ad_urls 
url_str = [str(unicode) for unicode in ad_urls]

# What's in url_str?
for url in url_str:
    print url

これを実行すると、次のようになります。

miami.craigslist.org/mdc/roo/4870912192.html miami.craigslist.org/mdc/roo/4858122981.html miami.craigslist.org/mdc/roo/4870665175.html miami.craigslist.org/mdc/roo/4857247075.html miami.craigslist.org/mdc/roo/4870540048.html ...

これはまさに私が欲しいものです:ページ上の各広告のURLを含むリストです。

次のステップは、これらの各ページから何かを抽出することで、別のBeautifulSoupオブジェクトを構築することでした。しかし、私は途中で止まってしまいました。

for url in url_str:
    ad_html = requests.get(str(url)).text

ここでようやく私の質問にたどり着きました。このエラーはいったい何なのでしょうか?私が意味を理解できるのは、最後の2行だけです。

 Traceback (most recent call last):   File "webscraping.py", line 24,
 in <module>
     ad_html = requests.get(str(url)).text   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py",
 line 65, in get
     return request('get', url, **kwargs)   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py",
 line 49, in request
     response = session.request(method=method, url=url, **kwargs)   File
 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py",
 line 447, in request
     prep = self.prepare_request(req)   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py",
 line 378, in prepare_request
     hooks=merge_hooks(request.hooks, self.hooks),   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py",
 line 303, in prepare
     self.prepare_url(url, params)   File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py",
 line 360, in prepare_url
     "Perhaps you meant http://{0}?".format(url)) requests.exceptions.MissingSchema: Invalid URL
 u'miami.craigslist.org/mdc/roo/4870912192.html': No schema supplied.
 Perhaps you meant http://miami.craigslist.org/mdc/roo/4870912192.html?

どうやら、すべてのリンクの前にu'がついていて、requests.get()が機能していないことが問題なようです。そのため、str()を使ってすべてのURLを普通の文字列にしようとしているのがわかると思います。しかし、何をやっても、このエラーが出ます。他に何か見落としているものがあるのでしょうか?私が問題を完全に誤解しているのでしょうか?

ありがとうございました。

どのように解決するのですか?

問題を誤解しているようです

メッセージは

 u'miami.craigslist.org/mdc/roo/4870912192.html': No schema supplied.
 Perhaps you meant http://miami.craigslist.org/mdc/roo/4870912192.html?

がないことを意味します。 http:// (スキーマ)の前に

に置き換わるので

ad_urls = ["miami.craigslist.org" + ad for ad in ad_ls]

によって

ad_urls = ["http://miami.craigslist.org" + ad for ad in ad_ls]

を実行する必要があります。