Веб-очистка релевантной информации из файла soup

#web-scraping #beautifulsoup

#веб-очистка #beautifulsoup

Вопрос:

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

 url="https://www.bankmayapada.com/en/contactus/location-information"
  

Однако файл soup, который я получаю, довольно запутанный, и я не могу понять, как извлечь необходимую информацию.

Нужная мне информация — это название филиала / банкомата и соответствующий ему адрес. Прямо сейчас я просто выясняю структуру файла soup.

 import re
import requests
from bs4 import BeautifulSoup

page = requests.get(url)

soup = BeautifulSoup(page.text, 'html.parser')
print(soup.prettify())
  

Ответ №1:

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

Вот как:

 import requests
from bs4 import BeautifulSoup

page = requests.post("https://myapps.bankmayapada.com/frontend/IN/lokasi.aspx").text
rows = BeautifulSoup(page, "html.parser").find_all("tr", {"class": "dxgvDataRow"})

branch_location_data = []
for row in rows:
    province, area, location = row.find_all("td")
    branch_location_data.append(
        [
            province.getText(strip=True),  # province column
            area.getText(strip=True),  # area column
            location.find("b").getText(strip=True),  # Branch name
            " ".join(
                d.getText() for d in location.find_all("div")  # branch address
                if not d.getText().startswith(("Tel", "Fax"))  # skipping Phone amp; Fax info
            ),
        ]
    )
for branch in branch_location_data:
    print(branch)

  

Вывод:

 ['DKI JAKARTA', 'Jakarta Barat', 'Kantor Capem Citra Garden 2', 'Rukan Citra Niaga Blok A-7 Jl. Utan Jati - Kalideres Jakarta - DKI  Jakarta']
['DKI JAKARTA', 'Jakarta Barat', 'Kantor Capem Puri Indah', 'Jl. Puri Indah Raya Blok I No. 2 Jakarta 11610 - DKI  Jakarta']
['DKI JAKARTA', 'Jakarta Barat', 'Kantor Capem Pasar Pagi Asemka', 'Jl. Pasar Pagi No. 84 Jakarta - DKI  Jakarta']
['DKI JAKARTA', 'Jakarta Barat', 'Kantor Capem Tanjung Duren', 'Jl. Tanjung Duren No. 91 B Jakarta 11470 - DKI  Jakarta']
['DKI JAKARTA', 'Jakarta Barat', 'Kantor Capem Meruya', 'Jl. Meruya Ilir Raya No. 82 G Jakarta - DKI  Jakarta']
['DKI JAKARTA', 'Jakarta Barat', 'Kantor Capem Jembatan Lima', 'Jl. KH Moch. Mansyur No. 24 A Jakarta - DKI  Jakarta']
and so on...
  

Комментарии:

1. TIL! Вы не возражаете немного расширить (или сослаться на некоторые источники)? Fun fact, no payload required!

2. Ну, честно говоря, все, что я сделал, это посмотрел на трафик в инструменте разработчика и проверил запрос, который отвечал за таблицу. На Headers вкладке это просто стена текста, и я подумал, какого черта, позвольте мне просто отправить a POST без всего этого мусора. Что может пойти не так? Ничего! Я вернул всю таблицу вместе с некоторыми другими материалами. Нет полезной нагрузки, нет ничего. Это просто сработало.

3. » myapps.bankmayapada.com/frontend/IN/lokasi.aspx » имеет выбор названий филиалов по умолчанию. Но я хочу проделать то же упражнение и для имен и адресов банкоматов. URL-адрес не меняется, когда я выбираю опцию atm. Как я могу сделать то же самое для банкоматов?

4. Вау! Мне никогда не приходило в голову попробовать это! Я просто посмотрел на GET «стену текста» заголовков и собирался сказать «забудьте об этом», когда вы опубликовали свой ответ. Теперь я собираюсь пробовать это на регулярной основе… Спасибо за идею!