使用dryscrape刮网:选择单选按钮C时出错

2024-06-07 22:53:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个用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元素,所以它返回了错误。我已经在循环中包含了tryexcept,现在它可以工作了。在

非常感谢您的帮助@CtheSky


Tags: runorghttptableswww错误tableicm
1条回答
网友
1楼 · 发布于 2024-06-07 22:53:10

正如错误消息所说,css选择没有问题。因为单选按钮是不可见的,所以点击失败。它的父节点不显示:

<div id="solapaspanel1" style="display: none;">...</div>

您可以运行一段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语句。在

相关问题 更多 >

    热门问题