2

今日は BeautifulSoup と Requests API をいじっていました。そこで、深さ 2 までのリンクをたどる単純なスクレーパーを作成しようと考えました (それが理にかなっている場合)。私がスクレイピングしているWebページのすべてのリンクは相対的です。(例:<a href="/free-man-aman-sethi/books/9788184001341.htm" title="A Free Man">)したがって、それらを絶対にするために、を使用してページのURLを相対リンクに結合すると思いましたurljoin

これを行うには、最初にタグから href 値を抽出する<a>必要があり、そのために次を使用すると考えましたsplit

#!/bin/python
#crawl.py
import requests
from bs4 import BeautifulSoup
from urlparse import urljoin

html_source=requests.get("http://www.flipkart.com/books")
soup=BeautifulSoup(html_source.content)
links=soup.find_all("a")
temp=links[0].split('"')

これにより、次のエラーが発生します。

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    temp=links[0].split('"')
TypeError: 'NoneType' object is not callable

ドキュメントを適切に読む前に、これはおそらく私の目的を達成するための最良の方法ではないことに気付きましたが、なぜ TypeError が発生するのでしょうか?

4

3 に答える 3

5

links[0]は文字列ではなく、bs4.element.Tag. それを調べようとするとsplit、魔法のように という名前のサブ要素を見つけようとしますが、split何もありません。あなたはそれをNoneと呼んでいます。

In [10]: l = links[0]

In [11]: type(l)
Out[11]: bs4.element.Tag

In [17]: print l.split
None

In [18]: None()   # :)

TypeError: 'NoneType' object is not callable

インデックスを使用して HTML 属性を検索します。

In [21]: links[0]['href']
Out[21]: '/?ref=1591d2c3-5613-4592-a245-ca34cbd29008&_pop=brdcrumb'

またはget、存在しない属性の危険性がある場合:

In [24]: links[0].get('href')
Out[24]: '/?ref=1591d2c3-5613-4592-a245-ca34cbd29008&_pop=brdcrumb'


In [26]: print links[0].get('wharrgarbl')
None

In [27]: print links[0]['wharrgarbl']

KeyError: 'wharrgarbl'
于 2013-03-14T12:25:04.393 に答える
1

クラスはプロキシを使用して属性にアクセスするためTag(Pavel が指摘するように、これは可能な場合は子要素にアクセスするために使用されます)、見つからないNone場合はデフォルトが返されます。

複雑な例:

>>> print soup.find_all('a')[0].bob
None
>>> print soup.find_all('a')[0].foobar
None
>>> print soup.find_all('a')[0].split
None

以下を使用する必要があります。

soup.find_all('a')[0].get('href')

どこ:

>>> print soup.find_all('a')[0].get
<bound method Tag.get of <a href="test"></a>>
于 2013-03-14T12:25:08.860 に答える