我正在努力抓一张通过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返回空字符串的任何理由。
如何访问该表的元素?
答案 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()