2

ScraperwikiでPythonを使用してスクレーパーを作成する方法を学んでいます。これまでのところ順調ですが、頭を動かすことができない問題について、頭をかいて数日を過ごしました。テーブルからすべてのリンクを取得しようとしています。それは機能しますが、001から486に移動するリンクのリストから、045にのみそれらを取得し始めます。url/ sourceはWebサイト上の都市のリストであり、ソースはここで確認できます:
http:// www .tripadvisor.co.uk / pages / by_city.htmlおよび特定のhtmlはここから始まります:

  </td></tr>
  <tr><td class=dt1><a href="by_city_001.html">'s-Gravenzande, South Holland Province&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;Aberystwyth, Ceredigion, Wales</a></td>
  <td class=dt1><a href="by_city_244.html">Los Corrales de Buelna,  Cantabria&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;Lousada, Porto District, Northern Portugal</a></td>
  </tr>
  <tr><td class=dt1><a href="by_city_002.html">Abetone, Province of Pistoia, Tuscany&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;Adamstown, Lancaster County, Pennsylvania</a>       /td>
  <td class=dt1><a href="by_city_245.html">Louth, Lincolnshire, England&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;Lucciana, Haute-Corse, Corsica</a></td>
  </tr>
  <tr><td class=dt1><a href="by_city_003.html">Adamswiller, Bas-Rhin, Alsace&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;Aghir, Djerba Island, Medenine Governorate</a>       </td>
  <td class=dt1><a href="by_city_246.html">Luccianna, Haute-Corse, Corsica&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;Lumellogno, Novara, Province of Novara, Piedmont</a></td>
  </tr>

私が求めているのは、「by_city_001.html」から「by_city_486.html」へのリンクです。これが私のコードです:

  def scrapeCityList(pageUrl):

html = scraperwiki.scrape(pageUrl)
root = lxml.html.fromstring(html)

print html

links = root.cssselect('td.dt1 a')

for link in links:

    url = 'http://www.tripadvisor.co.uk' + link.attrib['href']
    print url 

次のようにコードで呼び出されます。

  scrapeCityList('http://www.tripadvisor.co.uk/pages/by_city.html')

これを実行すると、0045から始まるリンクのみが返されます。

出力(045〜486)

http://www.tripadvisor.co.ukby_city_045.html
http://www.tripadvisor.co.ukby_city_288.html
http://www.tripadvisor.co.ukby_city_046.html
http://www.tripadvisor.co.ukby_city_289.html
http://www.tripadvisor.co.ukby_city_047.html
http://www.tripadvisor.co.ukby_city_290.html and so on...

セレクターを次のように変更してみました。

  links = root.cssselect('td.dt1')

そしてそれはこのように487の「要素」をつかみます:

<Element td at 0x13d75f0>
<Element td at 0x13d7650>
<Element td at 0x13d76b0>

しかし、これから「href」値を取得することはできません。cssselect行で「a」を選択すると最初の44リンクが失われる理由がわかりません。コードを見ましたが、手がかりがありません。

助けてくれてありがとう!

クレア

4

1 に答える 1

1

コードは正常に機能します。ここで実際の動作を確認できます:https ://scraperwiki.com/scrapers/tripadvisor_cities/

データストアに保存を追加したので、実際にすべてのリンクを処理していることがわかります。

import scraperwiki
import lxml.html

    def scrapeCityList(pageUrl):
    html = scraperwiki.scrape(pageUrl)
    root = lxml.html.fromstring(html)
    links = root.cssselect('td.dt1 a')
    print len(links)
    batch = []
    for link in links[1:]: #skip the first link since it's only a link to tripadvisor and not a subpage
        record = {}
        url = 'http://www.tripadvisor.co.uk/' + link.attrib['href']
        record['url'] = url
        batch.append(record)
    scraperwiki.sqlite.save(["url"],data=batch)

scrapeCityList('http://www.tripadvisor.co.uk/pages/by_city.html') 

2番目のcssセレクターを使用する場合:

links = root.cssselect('td.dt1')

次に、要素(tdのサブ要素)ではなく、td要素を選択します。これを行うことにより、aを選択できます。

url = 'http://www.tripadvisor.co.uk/' + link[0].attrib['href']

ここで、tdの最初のサブ要素([0])を選択します。

lxml.htmlの要素のすべての属性を表示する場合は、次を使用します。

print element.attrib

tdの場合:

{'class': 'dt1'}
{'class': 'dt1'}
{'class': 'dt1'}
...

とのために:

{'href': 'by_city_001.html'}
{'href': 'by_city_244.html'}
{'href': 'by_city_002.html'}
...
于 2013-01-30T10:06:27.283 に答える