2016-01-20 2 views
1
XPath

Я снова с вопросом для замечательных людей здесь :)Возникли проблемы с Python выскабливание

Ive недавно начал получать обратно в питона (50% сделано в codcademy лол) и решил сделать быстрый сценарий для веб-соскабливания спотовой цены на золото в CAD. Это, в конечном счете, станет частью гораздо большего скрипта ... но я ОЧЕНЬ ржавый и думал, что это будет хороший проект.

Мой вопрос: Я следовал за руководство над на http://docs.python-guide.org/en/latest/scenarios/scrape/ для достижения своей цели, однако мой сценарий всегда возвращает/печатает

<Element html at 0xRANDOM> 

с ВКОСЬ ЯВЛЯЮЩЕЙСЯ (я предполагаю) случайное шестнадцатеричное число. Это происходит независимо от того, какой веб-сайт я использую.

Мой код:

#!/bin/python 
#Scrape current gold spot price in CAD 

from lxml import html 
import requests 

def scraped_price(): 
    page = requests.get('http://goldprice.org/gold-price-canada.html') 
    tree = html.fromstring(page.content) 

    print "The full page is: ", tree #added for debug WHERE ERROR OCCURS 
    bid = tree.xpath("//span[@id='gpotickerLeftCAD_price']/text()") 
    print "Scraped content: ", bid 
    return bid 
gold_scraper = scraped_price() 

Мои исследования:

1) www.w3schools.com/xsl/xpath_syntax.asp

Это где я выяснял использовать «// пядь ', чтобы найти все объекты span и затем использовать @id, чтобы сузить его до того, что мне нужно.

2) Scraping web content using xpath won't work

Это заставляет меня думать, что я просто плохой установки tree.xpath. Однако я не могу понять, где и почему.

Любая помощь будет принята с благодарностью.

ответ

1

<Element html at 0xRANDOM>

То, что вы видите Печатаемая Element класс строковое представление lxml.html «s. Если вы хотите увидеть реальное содержание HTML, используйте tostring():

print(html.tostring(tree, pretty_print=True)) 

Вы также получаете Scraped content: [] распечатаны, которые на самом деле означает, что не было никаких элементов, соответствующих локатора. И, если вы увидите ранее напечатанный HTML, на самом деле нет элемента с id="gpotickerLeftCAD_price" в загруженном источнике.

Цены на этом конкретном сайте динамически обновляются с помощью непрерывных запросов JSONP GET, выпущенных периодически. Вы можете либо проанализировать эти запросы, либо остановиться на более высоком уровне, автоматизируя браузер через selenium. Демо (с использованием PhantomJS headless browser):

>>> import time 
>>> from selenium import webdriver 
>>> 
>>> driver = webdriver.PhantomJS() 
>>> driver.get("http://goldprice.org/gold-price-canada.html") 
>>> while True: 
...  print(driver.find_element_by_id("gpotickerLeftCAD_price").text) 
...  time.sleep(1) 
... 
1,595.28 
1,595.28 
1,595.28 
1,595.28 
1,595.28 
1,595.19 
... 
+0

переключение на html.tostring дает мне ошибку: Type 'ул' не может быть сериализовать – L8NIT3TR0UBL3

+0

@ L8NIT3TR0UBL3 хорошо, попробуйте сейчас, спасибо. – alecxe

+0

Я не совсем уверен, что понимаю, у моего кода есть раздел html.fromstring в переменной «tree», который при изменении на «tostring» дает ошибку сериализации. Я не уверен, как реализовать свое исправление в моем коде. Я прошу прощения, это был долгий день, и я не работал на полную мощность lol - может быть, селен был бы лучшей идеей для меня lol – L8NIT3TR0UBL3

Смежные вопросы