【发布时间】:2016-04-11 00:37:38
【问题描述】:
抓取静态页面可以这样工作:
soup = BeautifulSoup(driver.page_source, "lxml")
for results in soup.findAll("li", {"class" : "open"}):
print(results.get_text())
但是 Javascript 网站给我带来了问题。
所以我使用的是 PhantomJS,一开始的明显想法是“它只是在我尝试抓取时没有加载”。
所以我陷入了 time.sleep(不理想 - 我知道我会换成一个 present_of_element_locate)和一个:
driver.save_screenshot('screenshot.png') # save a screenshot to disk
该屏幕截图显示我正在查找的数据已加载。对于没有使用 Java 加载的元素,我可以使用与上面相同的代码从该页面上刮下其他数据。
根据屏幕截图,数据在页面上。而且我使用的数据与在 .Net 库上使用的数据相同,这些库可以很好地读取相同的站点。
for names in soup.findAll("span", {"class" : "the-name ng-name ng-big-scope"}):
print(names)
我在这里删除了 .get_text() 以防万一这会导致某些问题。但无论哪种方式,这都不会返回。我不知道为什么。
我可以在 vb.net 中使用完全相同的数据:
For Each element As HtmlElement In Me.Browser.Document.GetElementsByTagName("span")
If element.GetAttribute("className").Contains("the-name ng-name ng-big-scope") Then
print(element.innertext)
End If
Next
我知道我在那里的 .net 示例中使用了 .contains,但在这种情况下,我已经三次检查它是正确的类名。
所以语法适用于静态数据。 我有类名等......因为我可以在.Net上刮掉它。 我正在查找的数据已加载(根据它所获取的屏幕截图)。
我被难住了。非常感谢任何能指出我在这里搞砸的人。
/编辑:
我在另一个基于 Javascript 的网站上进行了测试,得到了第一个结果和第二个结果。当那里有十几个结果时。 .Net 再次毫无问题地处理了这个问题。
所以我正在考虑我的语法是否正常,而问题是 BF 在网站上处理格式错误的代码。打算尝试一两个替代方案,看看是否有任何改变。
【问题讨论】:
标签: python selenium web-scraping beautifulsoup phantomjs