Как продолжить цикл при очистке веб-страниц? - PullRequest
0 голосов
/ 21 февраля 2019

Я написал простой скрипт, чтобы изучить, как работать с Python.Я выбрал этот URL: https://www.ebay.co.uk/b/Mens-Coats-Jackets/57988/bn_692010

На странице 48 элементов, и каждый элемент содержит информацию о бренде, стиле и т. Д., Кроме 16-го, и мой код останавливается, когда дело доходит до 16-го.Поэтому мой вопрос заключается в том, как я могу продолжить этот цикл или как передать эти детали.Вот мой код ниже:

    from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup


my_url = 'https://www.ebay.co.uk/b/Mens-Coats-Jackets/57988/bn_692010'

#opening up connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, 'html.parser')

#grabs each product
containers = page_soup.findAll('div',{'class':'s-item__wrapper clearfix'})

filename = 'ebayproducts1.csv'
f = open(filename, 'w+')

headers = 'product_name, item_price, item_style, shipping_detail\n'

f.write(headers)

contain = containers[0]
container = containers[0]

for container in containers:
    product_name = container.h3.text

    item_details_container = container.findAll('div',{'class':'s-item__details clearfix'})
    item_price = item_details_container[0].div.text

    item_style = item_details_container[0].findAll('span',{'class':'s-item__detail s-item__detail--secondary'})[0].text

    shipping_detail = item_details_container[0].findAll('span',{'class':'s-item__shipping s-item__logisticsCost'})[0].text


    print('product_name: '+ product_name)

    print('item_price: ' + item_price)

    print('item_style: ' + item_style)

    print('shipping_detail: ' + shipping_detail)

    f.write("%s,%s,%s,%s\n" %( product_name, item_price, item_style, shipping_detail))

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы правы в том, что некоторые предметы отсутствуют, и вы не можете проверить это на позиции или селекторе в одних случаях во всех случаях, например, Стиль.Вы можете проверить наличие стиля в тексте контейнера.Кто-то с большим знанием Python, вероятно, мог бы привести это в нечто более питонское и эффективное

import requests
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
pattern = re.compile(r'Style:')
url = 'https://www.ebay.co.uk/b/Mens-Coats-Jackets/57988/bn_692010?_pgn=1'
res = requests.get(url)
soup = bs(res.content, 'lxml')
results = []
for item in soup.select('.s-item'):
    x = item.select_one('.s-item__title')
    title = x.text if x else None
    x = item.select_one('.s-item__price')
    price = x.text if x else None
    x = item.select_one('.s-item__shipping')
    shipping = x.text if x else None
    x = item.find('span', text=pattern)
    style = x.text.replace('Style: ','') if x else None
    results.append([title, price, shipping, style])

df = pd.DataFrame(results)
print(df)
0 голосов
/ 21 февраля 2019

Вероятно, в вашем списке containers вы обнаружите какой-либо элемент или тег, который отличается от всех других элементов, которые вы ищете.

Вы можете изменить способ указания списка containers, изменив свойпараметры поиска в методе soup.findAll().

Попробуйте напечатать containers и выясните, почему 16-й элемент в этом списке отличается, и скорректируйте свой поиск соответствующим образом.

В качестве альтернативы, вы можете использовать попытку, кроме как что-то вроде этого:

for container in containers:
    try:
       product_name = container.h3.text
       item_details_container = container.findAll('div',{'class':'s-item__details clearfix'})
       item_price = item_details_container[0].div.text
       item_style = item_details_container[0].findAll('span',{'class':'s-item__detail s- 
       item__detail--secondary'})[0].text
       shipping_detail = item_details_container[0].findAll('span',{'class':'s-item__shipping s-item__logisticsCost'})[0].text

       # etc ...

    except <name of your error here, eg. TypeError>:
        print(f'except triggered for {container}')

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