为什么BeautifulSoup无法解析页面的所有元素? (答案:BeautifulSoup中的CSS选择器)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么BeautifulSoup无法解析页面的所有元素? (答案:BeautifulSoup中的CSS选择器)相关的知识,希望对你有一定的参考价值。
我正在创建Instagram网络抓取工具(用于练习)。我正在使用Selenium来处理动态网页。我使用
加载网页driver.execute_script("return document.documentElement.outerhtml")
((这是在python中贯穿硒的javascript DOM行)
当我打印存储该函数输出的变量时,可以看到带有该类的标签。但是在我用BeautifulSoup解析它之后(像这样:soup(jspage, "html.parser")
)
然后打印出结果,我再也找不到标签和类了。如果您需要更多详细信息,我很乐意提供它们,请问。
这里是发生错误的代码段:
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/header/section/ul/li[3]/a').click()
time.sleep(5)
jspage = driver.execute_script("return document.documentElement.outerHTML")
print(jspage)
page = soup(jspage, "html.parser")
print(page)
elements = page.findAll("a", "class":"FPmhX notranslate _0imsa ")
print(elements)
for element in elements:
print(elements.text)
变量jspage确实包含FPmhX notranslate _0imsa
类名(为了澄清,空格不是拼写错误,它们是类名的一部分),而page变量不是,因此在打印出elements变量时返回一个空列表。这是页面的链接(我知道有更好的方法可以执行此操作,但是它们都会限制我只能刮取此页面)https://www.instagram.com/realdonaldtrump/following/
如果您需要我发布完整的代码,我很乐意这样做。
UPDATE 1:我为BeautifulSoup尝试使用lxml
解析器而不是html.parser
,并且得到了相同的结果。
UPDATE 2:我尝试将findAll
更改为find
,但仍然没有任何输出。我认为这证明了问题所在:page = soup(jspage, "html.parser")
但我不想掩盖任何人的意见。
经过一个小时的调查,我遇到了CSS选择器,它们可以在BeautifulSoup(我相信也是Selenium)中实现。当元素的class属性中包含空格时,表示该元素具有多个类。就我而言,它具有三个类:FPmhX, notranslate, _0imsa
。我只是更改了这一行:
elements = page.findAll("a", "class":"FPmhX notranslate _0imsa ")
到此行:
elements = page.select(".FPmhX.notranslate._0imsa")
希望这对您有所帮助!
以上是关于为什么BeautifulSoup无法解析页面的所有元素? (答案:BeautifulSoup中的CSS选择器)的主要内容,如果未能解决你的问题,请参考以下文章
由于 Cloudflare,从今天开始无法使用 BeautifulSoup 解析 coin gecko 页面