【问题标题】:Why is BeautifulSoup not parsing all of the page's elements?为什么 BeautifulSoup 不解析页面的所有元素?
【发布时间】:2020-04-24 21:35:09
【问题描述】:

我正在创建一个 Instagram 网络爬虫(用于练习)。我正在使用 Selenium 来处理动态网页。我使用

加载网页

driver.execute_script("return document.documentElement.outerHTML")

(这是在 python 中通过 selenium 运行的 javascript DOM 行)

当我打印存储该函数的输出的变量时,我可以看到带有类的标签。但是在我用 BeautifulSoup 解析它之后(像这样: soup(jspage, "html.parser"))

然后打印出结果,我再也找不到标签和类了。如果您需要更多详细信息,我很乐意提供,请尽管询问。

这是发生错误的代码的sn-p:

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/

如果您需要我发布完整的代码,我很乐意这样做。

更新 1:我尝试对 BeautifulSoup 使用 lxml 解析器而不是 html.parser,得到了相同的结果。

更新 2: 我尝试将 findAll 更改为 find,但仍然没有得到任何输出。我认为这证明问题出在这一行: page = soup(jspage, "html.parser") 但我不想影响任何人的意见。

回答:我已经在下面发布了答案,我会尽可能接受

【问题讨论】:

  • 类名有空格吗FPmhX notranslate _0imsa 可以发html代码吗
  • @0m3r 是的,该课程中确实有空格。我认为这就是问题所在。如果是这样,我该如何解决?原始 HTML 来自 instagram,所以在这里发布太长了。
  • 可以发链接吗
  • 当然。该链接指向唐纳德特朗普的 Instagram 个人资料,但实际的 HTML 来自打开一个对话框的Following 列表项。我正试图刮掉他追随的人的名字。我希望这也适用于其他用户。这是他个人资料的链接:https://www.instagram.com/realdonaldtrump/following/@0m3r
  • 我正在尝试抓取他关注的人的姓名 - 这可能是通过 xhr 查询加载的,如果您打开网络选项卡,您可以看到您的浏览器开发者工具。

标签: javascript python selenium web-scraping beautifulsoup


【解决方案1】:

经过一个小时的调查,我发现了 CSS 选择器,它们可以在 BeautifulSoup 中实现(我相信 Selenium 也是如此)。当一个元素的类属性中有空格时,表示该元素有多个类。在我的例子中,它有三个类:FPmhX, notranslate, _0imsa。我只是改变了这一行:

elements = page.findAll("a", {"class":"FPmhX notranslate _0imsa "}) 到这一行:

elements = page.select(".FPmhX.notranslate._0imsa")

希望这对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 2016-10-25
    • 2019-01-06
    • 1970-01-01
    • 2020-06-22
    • 2020-04-13
    • 1970-01-01
    相关资源
    最近更新 更多