Комплексный Python3 CSV скребок - PullRequest
0 голосов
/ 22 мая 2018

Приведенный ниже код отлично работает при извлечении данных из строки, в моем случае row [0] .Мне интересно, как настроить его для извлечения данных из нескольких строк?

Кроме того, я хотел бы иметь возможность указать, какой класс divTag (см. Код ниже) использовать дляконкретный столбец.

Что-то вроде для строки [1,2] используйте:

divTag = soup.find("div", {"class": "productsPicture"})

и для строки [4,5] используйте:

divTag = soup.find("div", {"class": "product_content"})

Если это имеет смысл для вас, ребята.

from bs4 import BeautifulSoup
import requests
import csv

with open('urls.csv', 'r') as csvFile, open('results.csv', 'w', newline='') as results:
reader = csv.reader(csvFile, delimiter=';')
writer = csv.writer(results)

for row in reader:
    # get the url
    url = row[0]
    print(url)

    # fetch content from server

    try:
        html = requests.get(url).content
    except requests.exceptions.ConnectionError as e:
        writer.writerow([url, '', 'bad url'])
        continue

    # soup fetched content
    soup = BeautifulSoup(html, 'html.parser')

    divTag = soup.find("div", {"class": "productsPicture"})

    if divTag:
        # Return all 'a' tags that contain an href
        for a in divTag.find_all("a", href=True):
            url_sub = a['href']

            # Test that link is valid
            try:
                r = requests.get(url_sub)
                writer.writerow([url, url_sub, 'ok'])
            except requests.exceptions.ConnectionError as e:
                writer.writerow([url, url_sub, 'bad link'])
    else:
        writer.writerow([url, '', 'no results'])

urls.csv пример:

https://www.tennis-point.com/index.php?stoken=737F2976&lang=1&cl=search&searchparam=E705Y-0193;
https://www.tennis-point.com/index.php?stoken=737F2976&lang=1&cl=search&searchparam=E703Y-0193;
https://www.tennis-point.com/index.php?stoken=737F2976&lang=1&cl=search&searchparam=E702Y-4589;
https://www.tennis-point.com/index.php?stoken=737F2976&lang=1&cl=search&searchparam=E706Y-9093;

Примеры классов для поиска:

classes to search for per column

1 Ответ

0 голосов
/ 24 мая 2018

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

from bs4 import BeautifulSoup
import requests
import csv

class_1 = {"class": "productsPicture"}
class_2 = {"class": "product_content"}
class_3 = {"class": "id-fix"}

# map a column number to the required find parameters
class_to_find = {
    0 : class_3,    # Not defined in question
    1 : class_1,    
    2 : class_1,
    3 : class_3,    # Not defined in question
    4 : class_2, 
    5 : class_2}

with open('urls.csv', 'r') as csvFile, open('results.csv', 'w', newline='') as results:
    reader = csv.reader(csvFile)
    writer = csv.writer(results)

    for row in reader:
        # get the url

        output_row = []

        for index, url in enumerate(row):
            url = url.strip()

            # Skip any empty URLs
            if len(url):
                #print('col: {}\nurl: {}\nclass: {}\n\n'.format(index, url, class_to_find[index]))

                # fetch content from server

                try:
                    html = requests.get(url).content
                except requests.exceptions.ConnectionError as e:
                    output_row.extend([url, '', 'bad url'])
                    continue
                except requests.exceptions.MissingSchema as e:
                    output_row.extend([url, '', 'missing http...'])
                    continue

                # soup fetched content
                soup = BeautifulSoup(html, 'html.parser')


                divTag = soup.find("div", class_to_find[index])

                if divTag:
                    # Return all 'a' tags that contain an href
                    for a in divTag.find_all("a", href=True):
                        url_sub = a['href']

                        # Test that link is valid
                        try:
                            r = requests.get(url_sub)
                            output_row.extend([url, url_sub, 'ok'])
                        except requests.exceptions.ConnectionError as e:
                            output_row.extend([url, url_sub, 'bad link'])
                else:
                    output_row.extend([url, '', 'no results'])      

        writer.writerow(output_row)

Используется функция enumerate()вернуть счетчик вист итерацию по списку.Таким образом, index будет 0 для первого URL и 1 для следующего.Затем его можно использовать со словарем class_to_find, чтобы получить необходимые параметры для поиска.

Каждый URL приводит к созданию 3 столбцов: URL-адреса, под-URL-адреса в случае успеха и результата.Их можно удалить, если не нужно.

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