Очистка таблиц от нескольких URL - PullRequest
0 голосов
/ 03 апреля 2020

Привет! Я смог очистить таблицы и экспортировать их с указанного c веб-сайта, но хотел бы добавить больше веб-сайтов для очистки. Он возвращает только второй URL, который я вставил. Извинения заранее, так как я очень плохо знаком с Python. Спасибо.

import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd

urls = ['http://a810-bisweb.nyc.gov/bisweb/BScanItemsRequiredServlet?requestid=7&defaultdisplay=y&passjobnumber=123821098&passdocnumber=01&allbin=1015650', 'http://a810-bisweb.nyc.gov/bisweb/BScanItemsRequiredServlet?requestid=6&defaultdisplay=y&passjobnumber=121054170&passdocnumber=01&allbin=1015650']

for url in urls:
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', "Upgrade-Insecure-Requests": "1","DNT": "1","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language": "en-US,en;q=0.5","Accept-Encoding": "gzip, deflate"}
    page = requests.get(url,headers=headers)
    soup = BeautifulSoup(page.content, 'html.parser')
    table = soup.find_all('table')[3]
    df = pd.read_html(str(table))[0]

print(df)

1 Ответ

0 голосов
/ 03 апреля 2020

Ну, проблема в том, что вы перебираете tables без добавления. и тогда вы printing out.

Пример :

for item in range(1, 4):
    pass

print(item)

Теперь вывод:

3

Потому что это последний возвращаемый элемент из loop.

Но, если мы добавим, как показано ниже:

result = []
for item in range(1, 4):
    result.append(item)

print(result)

Итак, мы получим следующее:

[1, 2, 3]

Теперь, давайте перейдем к следующему пункту, вы уже можете прочитать table напрямую, используя pandas .read_ html, поскольку urllib3 уже находится в фоновом режиме pandas, как показано ниже:

import pandas as pd

df = pd.read_html(
    "http://a810-bisweb.nyc.gov/bisweb/BScanItemsRequiredServlet?requestid=7&defaultdisplay=y&passjobnumber=123821098&passdocnumber=01&allbin=1015650")[3]

print(df)

Но поскольку уровень веб-сайта TCP настроен на Connection: close ref .

HTTP / 1.1 определяет параметр соединения "close" для отправитель сигнализирует, что соединение будет закрыто после завершения ответа. Например,

   Connection: close

Итак, мы запустим эту библиотеку в requests с сохранением объекта Session, чтобы он не блокировался брандмауэром server с помощью requests.Session() и добавлением table для каждого url и затем объединить его в одну table с использованием функции pd.concat, а затем преобразовать в csv using pd.to_csv():

import pandas as pd
import requests

urls = ['http://a810-bisweb.nyc.gov/bisweb/BScanItemsRequiredServlet?requestid=7&defaultdisplay=y&passjobnumber=123821098&passdocnumber=01&allbin=1015650',
        'http://a810-bisweb.nyc.gov/bisweb/BScanItemsRequiredServlet?requestid=6&defaultdisplay=y&passjobnumber=121054170&passdocnumber=01&allbin=1015650']

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
}


def main(urls):
    goal = []
    with requests.Session() as req:
        for url in urls:
            r = req.get(url, headers=headers)
            df = pd.read_html(r.content)[3]
            goal.append(df)
    goal = pd.concat(goal)
    goal.to_csv("data.csv", index=False)


main(urls)

Вывод: Просмотр в сети

enter image description here

Код обновлен согласно Пользователь Запрос:

import pandas as pd
import requests

urls = ['http://a810-bisweb.nyc.gov/bisweb/BScanItemsRequiredServlet?requestid=7&defaultdisplay=y&passjobnumber=123821098&passdocnumber=01&allbin=1015650',
        'http://a810-bisweb.nyc.gov/bisweb/BScanItemsRequiredServlet?requestid=6&defaultdisplay=y&passjobnumber=121054170&passdocnumber=01&allbin=1015650']

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
}


def main(urls):
    goal = []
    with requests.Session() as req:
        for url in urls:
            r = req.get(url, headers=headers)
            df = pd.read_html(r.content)[2:4]
            for table in df:
                goal.append(table)
    goal = pd.concat(goal)
    goal.to_csv("data.csv", index=False)


main(urls)

Вывод: просмотр -онлайн

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