刮擦静态页面的效果如下:
soup = BeautifulSoup(driver.page_source, "lxml")
for results in soup.findAll("li", {"class" : "open"}):
print(results.get_text())
但是Javascript网站引起了我的问题。
所以我使用PhantomJS,一开始就有一个明显的想法是#34;当我试图刮掉#34时,它就没有加载。
所以我陷入了一个time.sleep(不理想 - 我知道我会换到一个presence_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在网站上处理格式错误的代码。试着用一两个替代品来看看是否会改变任何东西。
答案 0 :(得分:0)
证明代码没有错。
网站上格式错误的HTML导致lxml出现问题,导致无法读取结果。