get_text () из bs4 отличается для тегов span? Не могу удалить теги span - PullRequest
1 голос
/ 05 июня 2019

Пока я делаю веб-скребок, я могу найти доступную информацию.на 2 полях данных я могу использовать beautifulsoup get_text (), чтобы извлечь html из данных

, но 3-ий поля не будут работать, когда я использую get_text ().Я могу заставить его дать мне весь тег span, но не текст внутри него.

Я пробовал разные итерации для получения данных одинаково, он даст мне весь тег span, т.е.stuff

Попытка установить номер телефона для номера телефона внутри этого тега span

<span class="business--telephoneNumber" itemprop="telephone">01430 422826 </span>

Я пытался

from bs4 import BeautifulSoup
import requests
import csv

data_list=[]
url = 'https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
site = requests.get(url, headers=headers, timeout=5);
if site.status_code is 200:
    content = BeautifulSoup(site.content, 'html.parser')
    #print(content)
    questions = content.find_all(class_='businessCapsule') 
for question in questions:
        busname = question.find(class_='businessCapsule--name').get_text()
        bustype =   question.find(class_='businessCapsule--classification').get_text()
        busnum = question.find('span', {'itemprop': 'telephone'})
        print(busnum)
        busnumber = busnum.get_text()
        new_data = {"busname": busname, "bustype": bustype, "busnumber": busnumber}
        data_list.append(new_data)
    with open ('selector.csv','w') as file:
        writer = csv.DictWriter(file, fieldnames = ["busname", "bustype", "busnumber"], delimiter = ';')
        writer.writeheader()
        for row in data_list:
            writer.writerow(row)

, а также

from bs4 import BeautifulSoup
import requests
import csv

data_list=[]
url = 'https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
site = requests.get(url, headers=headers, timeout=5);
if site.status_code is 200:
    content = BeautifulSoup(site.content, 'html.parser')
    #print(content)
    questions = content.find_all(class_='businessCapsule')
    for question in questions:
        busname = question.find(class_='businessCapsule--name').get_text()
        bustype =   question.find(class_='businessCapsule--classification').get_text()
        busnumber = question.find('span', {'itemprop': 'telephone'}).get_text()
        new_data = {"busname": busname, "bustype": bustype, "busnumber": busnumber}
        data_list.append(new_data)
    with open ('selector.csv','w') as file:
        writer = csv.DictWriter(file, fieldnames = ["busname", "bustype", "busnumber"], delimiter = ';')
        writer.writeheader()
        for row in data_list:
            writer.writerow(row)

в обоих случаях get_text () выдает эту ошибку

Traceback (most recent call last):
  File "webscraper2.py", line 22, in <module>
    busnumber = busnum.get_text()
AttributeError: 'NoneType' object has no attribute 'get_text'

если get_text удален, он выдаст весь тег

<span class="business--telephoneNumber" itemprop="telephone">01430 422826 </span>

мне нужен только введенный номер телефона.

обновление - последний код

from bs4 import BeautifulSoup as bs
import requests
import csv

data_list=[]
url = 'https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
site = requests.get(url, headers=headers, timeout=5)
soup = bs(site.content, 'html.parser')
questions = soup.select('.businessCapsule--mainContent')
for question in questions:
    busname = question.find(class_='businessCapsule--name').get_text()
    bustype =   question.find(class_='businessCapsule--classification').get_text()
    busnumber = question.select_one('span.business--telephoneNumber').text
    print(busnumber)
    new_data = {"busname": busname, "bustype": bustype, "busnumber": busnumber}
    data_list.append(new_data)
with open ('selector.csv','w') as file:
    writer = csv.DictWriter(file, fieldnames = ["busname", "bustype", "busnumber"], delimiter = ';')
    writer.writeheader()
    for row in data_list:
        writer.writerow(row)

1 Ответ

1 голос
/ 05 июня 2019

Вам нужно получить другого родителя, чтобы выбрать подходящего ребенка и изменить свой селектор для ребенка, как показано ниже:

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
site = requests.get(url, headers=headers, timeout=5)
soup = bs(site.content, 'lxml')
questions = soup.select('.businessCapsule--mainContent:has(span.business--telephoneNumber)')
for question in questions:
    print(question.select_one('span.business--telephoneNumber').text)

Если вы выберете этот другой родительский селектор, вы увидите, что он выделяет весь блок с информацией, чтобы вы могли затем выбрать различных детей

enter image description here

Если это слишком быстро, вы можете проверить, присутствовал ли тел

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
site = requests.get(url, headers=headers, timeout=5)
soup = bs(site.content, 'lxml')
questions = soup.select('.businessCapsule--mainContent')
for question in questions:
    tel = question.select_one('span.business--telephoneNumber')
    if tel is None:
        tel = 'Not present'
    else:
        tel = tel.text
    print(tel)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...