为什么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 页面

Python爬虫如何获取页面内所有URL链接?本文详解

Python爬虫如何获取页面内所有URL链接?本文详解

为啥 BeautifulSoup 无法正确读取/解析此 RSS (XML) 文档?

Beautifulsoup4 没有返回页面上的所有链接

python BeautifulSoup解析表