我试图刮字典,字典网页就是这样:
有一个搜索框,用于输入要查找的单词
有一个按钮,因此在输入单词后,您必须单击它以查看结果
问题是网站是使用JavaScript设计的,这意味着当我点击Go按钮时,网页网址不会改变,只有div
内的内容发生变化,{{1 }}
请注意,点击“转到”按钮后,搜索框内容将通过JavaScript使用post方法发布到服务器。
这是我目前的代码:
<div id="dict_entry">content of the entry for the given word goes here</div>
上面代码的问题是,当我导航到using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
using (var driver = new ChromeDriver())
{
driver.Navigate().GoToUrl("http://www.mydictionary.com/dictionary");
var searchField = driver.FindElementById("search");
var searchButton = driver.FindElementByXPath("//*[@id=\"search_submit\"]");
searchField.SendKeys("writer");
searchButton.Click();
var result = driver.FindElementByXPath("//*[@id=\"dict_entry\"]").Text;
File.WriteAllText("result.txt", result);
}
}
}
}
时,字典会加载默认的第一个条目,即条目http://mydictionary.com/dictionary
的条目,我试图获取单词条目:a
但我的代码获取了单词writer
的内容,因为它不会等待表单提交到服务器并在抓取网页之前获得其响应。由于网页是一个JavaScript驱动的网页,我怎样才能确保我的JavaScript表单帖子的响应已经返回,以便在获得新的JavaScript操作DOM后我将其删除?
换句话说:在webscraping之前,如何通过JavaScript等待新创建的DOM?
答案 0 :(得分:0)
是否可以在Clear()
SendKeys()
方法
searchField.Clear();
searchField.SendKeys("writer");
答案 1 :(得分:0)
使用下面的代码显式等待Web元素
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("id")));
然后得到结果。
答案 2 :(得分:0)
我发现这个等待jquery完成的解决方案似乎正在运行:
while (true) // Handle timeout somewhere
{
var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
if (ajaxIsComplete)
break;
Thread.Sleep(100);
}