使用Splinter模块通过Web抓取动态内容

时间:2016-11-03 00:05:05

标签: python web-scraping phantomjs splinter

我正在努力抓一张通过js动态加载的表(来自steamcommunity)。我使用了python Splinter和无头浏览器Phantomjs的组合。

以下是我已经提出的建议:

from splinter import Browser
import time
import sys

browser = Browser('phantomjs')

url = 'https://steamcommunity.com/market/listings/730/%E2%98%85%20Karambit%20%7C%20Blue%20Steel%20(Battle-Scarred)'   

browser.visit(url)
print browser.is_element_present_by_xpath('//*[@id="market_commodity_buyreqeusts_table"]', wait_time = 5)
price_table = browser.find_by_xpath('//*[@id="market_commodity_buyreqeusts_table"]/table/tbody/tr')

print price_table
print price_table.first
print price_table.first.text
print price_table.first.value
browser.quit()

第一种方法is_element_present_by_xpath()确保加载我感兴趣的表格。然后我尝试访问该表的行。

正如我从Splinter文档中所理解的那样,.find_by_xpath()方法返回ElementList,这实际上是一个提供了一些别名的普通列表。

Price_table是表格中所有行的ElementList。最后两个打印结果给出了空结果,我找不到text-method返回空字符串的任何理由。

如何访问该表的元素?

2 个答案:

答案 0 :(得分:0)

你有没有试过for i in price_table呢?从code开始,ElementList元素扩展了python list。我相信你可以迭代price_table

编辑:这也是我第一次听说splinter,它看起来只是对selenium python包的抽象。也许如果你被困住,你可以看看selenium docs。写得更好。

from splinter import Browser
import time
import sys

browser = Browser('phantomjs')

url = 'https://steamcommunity.com/market/listings/730/%E2%98%85%20Karambit%20%7C%20Blue%20Steel%20(Battle-Scarred)'   

browser.visit(url)
print browser.is_element_present_by_xpath('//*[@id="market_commodity_buyreqeusts_table"]', wait_time = 5)
price_table = browser.find_by_xpath('//*[@id="market_commodity_buyreqeusts_table"]/table/tbody/tr')

for i in price_table:
    print i
    print i.text

browser.quit()

答案 1 :(得分:0)

我尝试了使用不同浏览器的代码并且总是空text但我在html中找到了预期的数据。也许这只是splinter中的错误。

from splinter import Browser

#browser = Browser('firefox')
#browser = Browser('phantomjs')

#browser = Browser('chrome') # executable_path='/usr/bin/chromium-browser' ??? error !!!
browser = Browser('chrome') # executable_path='/usr/bin/chromedriver' OK

url = 'https://steamcommunity.com/market/listings/730/%E2%98%85%20Karambit%20%7C%20Blue%20Steel%20(Battle-Scarred)'   

browser.visit(url)

print(browser.is_element_present_by_xpath('//*[@id="market_commodity_buyreqeusts_table"]', wait_time = 5))

price_table = browser.find_by_xpath('//*[@id="market_commodity_buyreqeusts_table"]/table/tbody/tr')

for row in price_table:
    print('row html:', row.html)
    print('row text:', row.text) # empty ???
    for col in row.find_by_tag('td'):
        print('  col html:', col.html)
        print('  col text:', col.text) # empty ???

browser.quit()