Как получить текст из BeautifulSoup, получая ошибку - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь получить текст с веб-страницы - https://www.symantec.com/security_response/definitions.jsp?pid=sep14

Точно, где это говорит - Защита на основе файлов (традиционный антивирус) Расширенная версия: 18.04.2009, ред. 2 I only want the text Highlighted in Red

Но я все еще сталкиваюсь с ошибками, могу ли я получить часть, в которой говорится - 18.04.2009, ред. 2 * * +1010

from bs4 import BeautifulSoup
import requests
import re
page = requests.get("https://www.symantec.com/security_response/definitions.jsp?pid=sep14")
soup = BeautifulSoup(page.content, 'html.parser')
extended = soup.find_all('div', class_='unit size1of2 feedBody')
print(extended)

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Вы можете использовать селекторы CSS для этого.Это делается с помощью Beautiful Soup 4.7+.Здесь мы нацеливаемся на те же div и классы, которые вы сделали выше, но мы также ищем потомка li и его прямого потомка > strong.Затем мы используем пользовательский псевдокласс :contains(), чтобы гарантировать, что элемент strong содержит текст Extended Version:.Мы используем select_one вызов API, поскольку он вернет первый соответствующий элемент, select вернет все элементы, которые совпадают в списке, но нам нужен только один.

Как только у нас будет элемент strongмы знаем, что следующий текстовый узел имеет необходимую информацию, поэтому мы можем просто использовать next_sibling, чтобы получить этот текст:

from bs4 import BeautifulSoup
import requests
page = requests.get("https://www.symantec.com/security_response/definitions.jsp?pid=sep14")
soup = BeautifulSoup(page.content, 'html.parser')
extended = soup.select_one('div.unit.size1of2.feedBody li:contains("Extended Version:") > strong')
print(extended.next_sibling)

Вывод

4/18/2019 rev. 7

РЕДАКТИРОВАТЬ: As @QHarr упоминает в комментариях, вы, скорее всего, можете уйти с более упрощенным strong:contains("Extended Version:").Важно помнить, что :contains() ищет все дочерние текстовые узлы данного элемента, даже субтекстовые узлы дочерних элементов, поэтому важно быть конкретным.Я бы не стал использовать :contains("Extended Version:"), поскольку он нашел бы div, элементы списка и т. Д., Поэтому при указании (как минимум) strong должно сузить выбор настолько, чтобы дать вам именно то, что вам нужно.

0 голосов
/ 19 апреля 2019

Попробуйте это возможно?

from bs4 import BeautifulSoup
import requests
import re
page = requests.get("https://www.symantec.com/security_response/definitions.jsp?pid=sep14")
soup = BeautifulSoup(page.content, 'html.parser')
extended = soup.find('div', class_='unit size1of2 feedBody').findAll('li')

print(extended[2].text.strip())
0 голосов
/ 19 апреля 2019

Я изменил ваш код, как показано ниже, теперь он показывает, что вы хотите

from bs4 import BeautifulSoup
import requests
import re
page = requests.get("https://www.symantec.com/security_response/definitions.jsp?pid=sep14")
soup = BeautifulSoup(page.content, 'html.parser')
extended = soup.find('div', class_='unit size1of2 feedBody').find_all('li')

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