我正在尝试从在网页(http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28063799)中使用 javascript 更新的表中获取数据,并且我正在使用 dryscrape。我有一个代码可以很好地处理页面加载时默认生成的表。但是我需要通过单击单选按钮(第二个表中标记为“主要”的单选按钮)来更新其中一个。
我更改了代码,它看起来像这样:
from bs4 import BeautifulSoup
import pandas as pd
import dryscrape
render = dryscrape.Session()
render.visit("http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28063799")
radiob = render.at_css('#nivEd12\.grafica3')
radiob.click()
source = render.body()
school_card = BeautifulSoup(source, "lxml")
school_tables = school_card.findAll('table', class_="tablaGraficaDatos")
table = list(school_tables)[1]
pd.read_html(table.prettify())
但我收到以下错误:
InvalidResponseError: {"class":"ClickFailed","message":"Failed to find position for element /html/body/div[@id='contenedor']/div[@id='solapas']/div[10]/table/tbody/tr[1]/td[1]/div[@id='solapaspanel1']/div[@id='cuerpoL']/div/div[@id='capaSelGrafica']/div[@id='display.grafica3']/table/tbody/tr[2]/td[2]/input[@id='nivEd12.grafica3'] because it is not visible"}
我也尝试过使用xpath:
radiob = render.at_xpath('//*[(@id = "nivEd12.grafica3")]')
但我得到同样的错误。
我使用 Selector Gadget 来获取 CSS 和 XPath。我想单选按钮的路径有一些错误,但我不知道如何修复它。任何的想法?
提前致谢。
更新
@CtheSky 给了我一个适用于单身网址的解决方案。但是当我尝试循环到多个 url 时,我得到一个错误。这是脚本。
schools_urls2 = ['http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28077865',
'http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28063751',
'http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28004989',
'http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28004990']
school_tables_collection = {}
school_name_collection = []
render = dryscrape.Session()
for z, school in enumerate(schools_urls[:5]):
render.visit(school)
render.driver.exec_script('document.getElementById("nivEd12.grafica3").click();')
source = render.body()
school_card = BeautifulSoup(source, "lxml")
school_tables = school_card.findAll('table', class_="tablaGraficaDatos")
school_name = school_card.find(style="text-transform:uppercase").next.next
for i, table in list(enumerate(school_tables)):
if i <= 1:
school_tables_collection[school_name + "_" + str(i)] = \
pd.read_html(table.prettify())
school_name_collection.append(school_name)
print "Tables of school %s extracted" % schools_urls[z]
知道我做错了什么吗?
解决方案
我终于设法修复它。这是我的一个愚蠢的错误:我调用的第一个 url 没有我正在寻找的按钮元素,所以它返回了错误。我在循环中包含了一个try
andexcept
现在它可以工作了。
非常感谢您的帮助@CtheSky