Ошибка очистки веб-страниц в Python: объект 'NoneType' не вызывается после использования функции split - PullRequest
0 голосов
/ 04 марта 2019

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

Пока мой скрипт успешно вытаскивает имяи номер телефона, но я застреваю при извлечении электронной почты, которая вложена в объект скрипта.Мои последние две попытки были связаны с использованием регулярных выражений и, когда это не удалось, функцией разделения, которая возвращает ошибку, упомянутую в заголовке.

Скрипт:

import re
import requests

from urllib.request import urlopen
from bs4 import BeautifulSoup

url1 = "http://pcoc.officialbuyersguide.net/Listing?MDSID=CPC-1210"
html = urlopen(url1)
soup = BeautifulSoup(html,'html.parser')

for company_name in soup.find_all(class_='ListingPageNameAddress NONE'):
    print(company_name.find('h1').text)

for phone in soup.find_all(class_='ListingPageNameAddress NONE'):
    print(phone.find(class_='Disappear').text)

for email in soup.findAll(class_='ListingPageNameAddress NONE'):
    print(email.find('script').text)
    print(email.split('LinkValue: "')[1].split('"')[0])
    print(re.findall(r"([\w\._]+\@([\w_]+\\.)+[a-zA-Z]+)", soup))

Ошибка:

TypeError                                 Traceback (most recent call last)
<ipython-input-20-ace5e5106ea7> in <module>
      1 for email in soup.findAll(class_='ListingPageNameAddress NONE'):
      2     print(email.find('script').text)
----> 3     print(email.split('LinkValue: "')[1].split('"')[0])
      4     print(re.findall(r"([\w\._]+\@([\w_]+\\.)+[a-zA-Z]+)", soup))

TypeError: 'NoneType' object is not callable

HTML внутри «скрипта», из которого я пытаюсь извлечь:

EMLink('com','aol','mikemhnam','<div class="emailgraphic"><img style="position: relative; top: 3px;" src="https://www.naylornetwork.com/EMailProtector/text-gif.aspx?sx=com&nx=mikemhnam&dx=aol&size=9&color=034af3&underline=yes" border=0></div>','pcoc.officialbuyersguide.net Inquiry','onClick=\'$.get("TrackLinkClick", { LinkType: "Email", LinkValue: "mikemhnam@aol.com", MDSID: "CPC-1210", AdListingID: "" });\'')

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Попробуйте, это может решить вашу проблему.

import re
import requests

from urllib.request import urlopen
from bs4 import BeautifulSoup

url1 = "http://pcoc.officialbuyersguide.net/Listing?MDSID=CPC-1210"
html = urlopen(url1)
soup = BeautifulSoup(html,'html.parser')

for company_name in soup.find_all(class_='ListingPageNameAddress NONE'):
    print(company_name.find('h1').text)

for phone in soup.find_all(class_='ListingPageNameAddress NONE'):
    print(phone.find(class_='Disappear').text)

for email in soup.findAll(class_='ListingPageNameAddress NONE'):
    print(email.find('script').text)
    a=email.find('script').text
#    print(email.split('LinkValue: "')[1].split('"')[0])
    print(str(re.findall(r"\S+@\S+", a)).split('"')[1])
0 голосов
/ 04 марта 2019

Насколько мне известно, BeautifulSoup не предоставляет функции split для элементов.

Элементы BeautifulSoup позволяют вам указать любой атрибут жестко, и если это не свойство или функцияэлемента, он будет искать тег с таким именем.Например, element.div найдет первого потомка element, то есть div.Таким образом, вы можете даже делать такие вещи, как element.nonsense, и, поскольку nonsense не является функцией или свойством объекта element, он затем ищет в дереве документа потомка с именем nonsense, и поскольку он не 'Если он существует, он просто вернет None.

Поэтому, когда вы вызываете email.split(...), он не находит функцию или свойство с именем split в объекте email, поэтому он ищет HTMLдерево для тега с именем split.Поскольку он не может найти элемент с именем split, он возвращает None, и вы пытаетесь вызвать его как функцию, что приводит к ошибке, которую вы получаете.

Возможно ли, что вы имели в видуполучить текст по электронной почте email.text.split()?

...