BeautifulSoup возвращает избыточный контент для тегов <meta> - PullRequest
1 голос
/ 25 февраля 2020

В основном я пытаюсь получить все метатеги с сайта с bs4.

import urllib.request
from bs4 import BeautifulSoup
response = urllib.request.urlopen("https://grab.careers/").read()
response_decode = response.decode('utf-8')
soup = BeautifulSoup(response_decode,"html.parser")
metatags = soup.find_all('meta')
file = open('text.out','w')
for x in metatags:
    file.write(str(x))
file.close()

Я ожидаю, что из приведенного выше кода будут возвращены только метатеги. Однако суп возвращает и содержимое мета, и ссылки, и содержимое сценариев, как вы можете видеть из этого фрагмента:

<meta content="Grab Careers | Working For A Better Southeast Asia" name="twitter:title" />
<meta content="Working For A Better Southeast Asia on Grab Careers�" name="twitter:description" />
<link href="https://grab.careers/" rel="canonical">
<script
    type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","url":"https://grab.careers/","name":"Grab Careers","potentialAction":{"@type":"SearchAction","target":"https://grab.careers/search/{search_term_string}","query-input":"required name=search_term_string"}}</script>

Я не смог найти никаких ресурсов, решающих эту проблему. Как это исправить, чтобы возвращались только метатеги.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

find_all метод дает тег вместе со всеми его потомками.

Я думаю, что это происходит из-за отсутствия закрытия / для пустых HTML тегов. Теги meta, которые закрыты должным образом, например <meta charset="utf-8"/> (примечание / в конце), анализируются как один отдельный тег.

В то время как метатег, такой как <meta content="max-snippet:-1,max-image-preview:standard,max-video-preview:-1" name="robots">, не анализируется как закрытый тег ( из-за отсутствия /) и, таким образом, включает все теги, пока не встретится закрывающий </meta>. Эти дочерние теги на самом деле включают теги ссылок и сценариев, которые вы видите.

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

Если честно, я не могу точно понять, почему это происходит, но это можно решить, если вы используете lxml вместо html.parser:

soup = BeautifulSoup(response_decode,"lxml")

lxml пакетов необходимо установить Например, с: pip install lxml

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