Нужна помощь в Python веб-соскоб - PullRequest
1 голос
/ 22 марта 2020

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

Вот мой код:

import requests
from bs4 import BeautifulSoup
import csv

def get_page(url):
    response = requests.get(url)

    if not response.ok:
        print('server responded:', response.status_code)
    else:
        soup = BeautifulSoup(response.text, 'html.parser')
    return soup

def get_detail_data(soup):

    try:
        title = soup.find('a',class_="ListingDetails_Level1_SITELINK",id=False).text
    except:
        title = 'empty'  
    print(title)
    try:
        address = soup.find('div',class_="ListingDetails_Level1_CONTACTINFO",id=False).find_all('span').text
    except:
        address = "address"
    print(address)
    try:
        person_name = soup.find('a',class_="",id=False).find_all('img').text
    except:
        person_name = "empty person"
    print(person_name)
    try:
        phone_no = soup.find('img',class_="",id=False).text
    except:
        phone_no = "empty phone no"
    print(phone_no)
    try:
        website = soup.find('a',class_="",id=False).text
    except:
        website = "empty website"
    print(website)




def main():
    url = "https://secure.kelownachamber.org/Pools-Spas/Rocky%27s-Reel-System-Inc-4751"
    #get_page(url)
    get_detail_data(get_page(url))
if __name__ == '__main__':
    main()

Ответы [ 2 ]

3 голосов
/ 22 марта 2020

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

import requests
from bs4 import BeautifulSoup
result = requests.get("https://secure.kelownachamber.org/Pools-Spas/Rocky%27s-Reel-System-Inc-4751")
src = result.content
soup = BeautifulSoup(src,'html.parser')
divs  = soup.find_all("div",attrs={"class":"ListingDetails_Level1_HEADERBOXBOX"})
for tag in divs:
  try:
   title = tag.find("a",attrs={"class":"ListingDetails_Level1_SITELINK"}).text
   address = tag.find("span",attrs={"itemprop":"street-address"}).text
   postal = tag.find("span",attrs={"itemprop":"postal-code"}).text
   maincontact = tag.find("span",attrs={"class":"ListingDetails_Level1_MAINCONTACT"}).text
   siteTag = tag.find("span",attrs={"class":"ListingDetails_Level1_VISITSITE"})
   site = siteTag.find("a").attrs['href']
   print(title)
   print(address) 
   print(postal)
   print(maincontact)
   print(site)
  except:
   pass
2 голосов
/ 22 марта 2020

В тех случаях, когда элементы страницы, которые вы пытаетесь обработать с помощью Beautiful Soup, не имеют классов или идентификаторов, может быть трудно сказать find() методу, что вы пытаетесь найти.

В этом случае я предпочитаю использовать либо select(), либо select_one(), которые задокументированы здесь . Эти методы позволяют передавать селектор CSS - тот самый синтаксис, который вы используете, чтобы указать веб-браузеру, какие элементы вы хотите стилизовать определенным образом.

Вы можете найти ссылку на доступные селекторы. вам здесь . Я не могу дать вам точное CSS выражение, которое вам понадобится для вашего случая, потому что вы не предоставили образец HTML, который вы пытаетесь очистить, но это должно помочь вам начать.

Например, если страница, которую вы пытаетесь очистить, выглядела так:

<div id="contact">
    <div>
        <a href="ListingDetails_Level1_SITELINK">Some title</a>
    </div>

    <div>
        <p>1, Sesame St., Address...... </p>
    </div>
</div>

Затем, чтобы получить адрес, вы можете использовать селектор CSS, например, так:

address = soup.select_one("#contact > div:nth-child(2) > p")

Выше сказано, что адрес будет найден, если сразу посмотреть во втором элементе div внутри элемента с идентификатором «contact», а затем сразу же посмотреть в этом абзаце.

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