Python3: как определить, какой элемент ‘text’ следует очистить, и как очистить URL с помощью class

#python #html #python-3.x #class #tags

#python #HTML #python-3.x #класс #Теги

Вопрос:

В настоящее время я очищаю веб-сайт и получаю текст некоторых деталей на веб-странице, которые я пытался идентифицировать с помощью кнопки ‘inspect’ в Google Chrome, и я действительно смог получить нужный текст из обычных текстовых элементов.

Однако у меня есть два вопроса:

1. Мне нужно правильно получить текст, связанный с соответствующим классом div. Как вы можете видеть в приведенном ниже коде, я только что ввел ‘h3’, ‘p’ и ‘abbr’, и я смог фактически получить текст, однако они не относятся конкретно к определенному ‘class’. Я полагаю, что он просто получает первый, с которым сталкивается, вот почему на некоторых веб-страницах я сталкиваюсь с приведенной ниже ошибкой, потому что она указывает на неправильный элемент.

   Traceback (most recent call last):
  File "C:UsersadminDesktopFolderNameFileName.py", line 18, in <module>
    name1 = info2_text.text
  AttributeError: 'NoneType' object has no attribute 'text'  

Итак, я предполагаю, что мой реальный вопрос № 1 заключается в том, чтобы избежать вышеуказанной ошибки из-за неверно идентифицированных абзацев ‘p’, как в примере ниже, как я могу ввести в код для идентификации в терминах ‘class’? Я уже пробовал info2_text = soup.find('p', attrs={'class': '_5rgt _5nk5 _5msi'}) , однако я получаю только вышеуказанную ошибку.

 <div class="_5rgt _5nk5 _5msi" style data-gt="{"tn":"*s"}" data-ft="{"tn":"*s"}"> == $0
 <span>
   <p>
     "Sample paragraph"
   </p>
  

2. Как получить фактический URL из a href элемента?В примере ниже:

 <div class="_52jc _5qc4 _78cz _24u0 _36xo" data-sigil="m-feed-voice-subtitle">
  <a href="sampleurl.com"></a>  

Я пытался использовать, info4_url = soup.find('a', attrs={'class': '_4g34._5i2i._52we'}) однако я могу печатать 'None' только для этой строки. Или я смотрю не на тот класс div?

Ниже приведен фактический код, который я пытаюсь использовать, и я хочу сделать его как можно более простым. Большое спасибо за вашу помощь!

 import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
from bs4 import SoupStrainer
import re
import requests

# specify the url
url = 'https://sampleurl.com/'

page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")
info1_header = soup.find('h3')
info2_text = soup.find('p')
info3_text = soup.find('abbr')
info4_url = soup.find('a')
# Get the data by getting its text
name = info1_header.text
name1 = info2_text.text
name2 = info3_text.text
#print text
print(name)
print(name1)
print(name2)
print(info4_url)
  

Комментарии:

1. посмотрите, поможет ли ответ, опубликованный ниже?

Ответ №1:

Найдите абзац / привязку только в соответствующем div:

По первому вопросу:

  html = '''<div class="_5rgt _5nk5 _5msi" style data-gt="{"tn":"*s"}" data-ft="{"tn":"*s"}"> == $0
 <span>
   <p>
     "Sample paragraph"
   </p>'''

soup = BeautifulSoup(html, 'html.parser')
parentDiv = soup.find_all("div", class_="_5rgt _5nk5 _5msi")
for elem in parentDiv:
    para = elem.find("p").text
    print(para.strip())
  

ВЫВОД:

 "Sample paragraph"
  

Что касается второго вопроса:

 html = '''<div class="_52jc _5qc4 _78cz _24u0 _36xo" data-sigil="m-feed-voice-subtitle">
  <a href="sampleurl.com"></a></div>'''

soup = BeautifulSoup(html, 'html.parser')
for anc in soup.find_all('div', class_="_52jc _5qc4 _78cz _24u0 _36xo"):
    anchor = anc.find("a")
    print("Found the URL:", anchor['href'])
  

ВЫВОД:

 Found the URL: sampleurl.com