Почему BeautifulSoup не анализирует все элементы страницы? - PullRequest
1 голос
/ 25 апреля 2020

Я создаю веб-скребок в Instagram (для практики). Я использую Selenium для работы с динамическими c веб-страницами. Я загружаю веб-страницу, используя

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

(Это строка javascript DOM, проходящая через селен в python)

Когда я печатаю переменную, хранящую вас вывод для этой функции, я вижу тег с классом. Но после того, как я проанализировал его в 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/

Если вам нужно, чтобы я опубликовал полный код, я был бы рад сделать это.

ОБНОВЛЕНИЕ 1: Я попытался использовать синтаксический анализатор lxml вместо html.parser для BeautifulSoup, и я получил тот же результат .

ОБНОВЛЕНИЕ 2: Я попытался изменить findAll на find, но я все еще не получил никакого вывода. Я думаю, что это доказывает, что проблема в этой строке: page = soup(jspage, "html.parser"), но я не хочу, чтобы кто-то окрашивал мнение.

ОТВЕТ: Я разместил ответ ниже и приму это когда я могу

1 Ответ

0 голосов
/ 25 апреля 2020

После часа исследования я наткнулся на CSS селекторы, и то, что они могут быть реализованы в BeautifulSoup (и Selenium тоже, я считаю). Когда атрибут класса элемента содержит пробелы, это означает, что элемент имеет несколько классов. В моем случае у него есть три класса: FPmhX, notranslate, _0imsa. Я просто изменил эту строку:

elements = page.findAll("a", {"class":"FPmhX notranslate _0imsa "}) на эту строку:

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

Надеюсь, это было полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...