我试图从一个用javascript在网页(http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28063799)内更新的表中获取数据,我使用的是dryscrape。我有一个代码,可以很好地处理页面加载时默认生成的表。但我需要通过单击单选按钮(第二个表中标记为“Primary”的单选按钮)来更新其中一个。在
我修改了代码,看起来像这样:
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())
但我得到了以下错误:
^{pr2}$我也尝试过xpath:
^{3}$但我也犯了同样的错误。在
我使用选择器Gadget来获取CSS和XPath。我想单选按钮的路径有一些错误,但我不知道如何修复它。有什么想法吗?在
提前谢谢。在
更新
@CtheSky给了我一个解决方案,它可以很好地处理单URL。但是当我尝试循环到多个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没有我要查找的button元素,所以它返回了错误。我已经在循环中包含了try
和except
,现在它可以工作了。在
非常感谢您的帮助@CtheSky
正如错误消息所说,css选择没有问题。因为单选按钮是不可见的,所以点击失败。它的父节点不显示:
您可以运行一段javascript来触发单击事件:
^{pr2}$更新:
注意,在第二个示例中,url
http://www.madrid.org/wpad_pub/run/j/MostrarFichaCentro.icm?cdCentro=28077865
中没有包含id=nivEd12.grafica3
的元素。因此,脚本在调用Null
上的click()
方法时失败,这是不允许的,并引发错误。在可能有些页面中没有目标对象,或者它们只是使用另一个id或名称。您应该使用更一般的规则来指定您想要的,为了避免这个错误,您可以通过
school_card.find_XX(...)
来检查元素是否存在,或者根据需要使用eval_script
来运行javascript语句。在相关问题 更多 >
编程相关推荐