【问题标题】:Python 3 webscraping issue (concerning JS)Python 3 网页抓取问题(关于 JS)
【发布时间】:2016-04-12 11:16:43
【问题描述】:

我一直在尝试抓取一个网站(使用 Python/Selenium),其中包含部分 JS 构建的链接和内容。在我的情况下,我想获得的链接如下所示:http://www.somesite.de/blah/{{link_ID}}

由于不能简单地直接抓取这个 URL,我的 Python 代码如下:

def URL_from_JS (URL):
    driver = webdriver.PhantomJS(executable_path=r'C:\###\phantomjs-2.1.1-windows\bin\phantomjs.exe')
    driver.get(URL)

    link = driver.find_element_by_xpath('//a[@title="Zum Expose"]')
    new_URL = link.get_attribute('href')
    print(new_URL)      #for testing reasons
    driver.close()
    return new_URL

这按预期工作,但是显然没有执行 JS 代码,因为结果与上面写的完全一样(即 http://www.somesite.de/blah/{{link_ID}} )。等待元素变得可见只会导致超时错误。 {{link_ID}} 引用了在一些外部 .js 文件中使用的变量,该变量是在 HTML 代码中的上面的一些行中导入的。

我必须手动执行导入的 Javascript 代码吗?我完全不知道为什么我的代码没有按预期工作......

感谢您的帮助!

【问题讨论】:

  • 如何将字符串从JS 文件发送到Python 代码?
  • 不太明白你的问题:我不会将字符串 vom JS 发送到 Python。 JS 代码很可能会使用 driver.execute_script 在 Python 中执行,但根据我对 Selenium 工作原理的理解,这实际上应该是不必要的。
  • ok....{{link_ID}} 来自哪里?提供包含href="http://www.somesite.de/blah/{{link_ID}}"的链接的HTML代码示例
  • 给你:immobilienscout24.de/neubau/formart/altoh-na-hamburg.html 编辑:尊敬的链接地址是immobilienscout24.de/expose/87513140(这栋楼里要买的第一套公寓)

标签: javascript python selenium


【解决方案1】:

更新: 我对其他网络驱动程序(FF、Chrome、Phantom)做了一些检查:都失败了,同样的异常(元素不可见)resp。超时异常。 接下来,我尝试自动单击其他一些链接——这也失败了。我发现所有这些链接中都有一些脚本,因为使用 html 中的“硬编码”链接,我的代码可以按预期工作。因此,我在正常的 Firefox 会话中禁用了 JS 检查了我的网站,所有这些链接和内容确实是不可见的(因此不可点击)。

到目前为止,我 100% 确定我可以指定我的问题/问题: 某些东西完全阻止了 Selenium 执行我页面的 Javascript;因此,我的代码不起作用。有人知道可能导致此问题的原因吗?

【讨论】:

    【解决方案2】:

    当我手动浏览网站时,它会在新标签页中打开链接。 PhantomJS 不支持标签页

    你可以用webdriver firefox试试,模拟点击第一个链接,切换到第二个标签页解析内容

    如果您能够看到该元素但 python 无法识别,则可能是帧的问题,可能在 body 标记中存在 iframe,其中我们有所需的元素,而 python 正在父帧中搜索

    p>

    您必须确定框架的名称并进行操作

    driver.switch_to.frame("")

    然后点击控件

    【讨论】:

    • 感谢您的回答。基本上,我们在这里有同样的问题:我们需要 click() 以打开新窗口的链接元素不会显示,它永远不会变得可见/可点击。如果你只是让驱动程序找到元素,然后点击它,Python 会抛出一个不可见的异常,如果你实现一个等待,你会得到一个超时异常。原因可能是因为构造链接结束部分的 JS 从未执行过。
    • 如果你能看到元素但python无法识别,那么它可能是框架的问题,在body标签中可能有iframe,我们有所需的元素并且python正在搜索父框架您必须识别框架的名称并执行 driver.switch_to.frame(">") 然后单击控件 hth
    • 这似乎是合理的,但不幸的是,事实并非如此。在源代码中快速搜索“frame”/“frameset”/“iframe”没有返回任何命中。
    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 2021-10-07
    • 2023-01-07
    • 2021-05-08
    • 2020-07-03
    相关资源
    最近更新 更多