Python urlopener не получает таблицы и списки - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь сделать простой веб-скребок, в котором я беру информацию со страницы HTML. Это просто, но у меня есть проблема, которую я не могу решить: когда я сам загружаю страницу HTML и разбираю ее с помощью BeautifulSoup, она анализирует все и предоставляет мне все данные, это нормально, но мне не нужно сделать это. Вместо этого я пытаюсь использовать ссылку, которая, похоже, не работает. Каждый раз, когда я использую ссылку с помощью функции urlopen и анализирую страницу с помощью BeautifulSoup, всегда кажется, что он полностью игнорирует / исключает некоторые списки и таблицы из файла HTML. Эти таблицы появляются, когда я просматриваю страницу в Интернете с помощью метода «Проверить элемент», и они также появляются, когда я сам загружаю страницу HTML, но они никогда не появляются, когда я использую функцию «urlopen». Я даже пробовал кодировать данные поста и отправлять их в качестве аргумента функции, но, похоже, это тоже не работает.

import bs4
from urllib.request import urlopen as uReq
from urllib.parse import urlencode as uEnc
from bs4 import BeautifulSoup as soup

my_url = 'https://sp.com.sa/en/tracktrace/?tid=RB961555017SG'

#data = {'tid':'RB961555017SG'}
#sdata = uEnc(data)
#sdata = bytearray(sdata, 'utf-8')

uClient = uReq(my_url, timeout=2)  # opening url or downloading the webpage
page_html = uClient.read() # saving html file in page_html
uClient.close() # closing url or connection idk properly

page_soup = soup(page_html, "html.parser") # parsing the html file and saving

updates = page_soup.findAll("div",{"class":"col-sm-12"})
#updates = page_soup.findAll("ol", {})

print(updates)

Эти таблицы содержат нужную мне информацию, могу ли я как-то исправить это?

1 Ответ

0 голосов
/ 13 июля 2020
Запрос

работает немного иначе, чем браузер. Например, он фактически не запускает JavaScript.

В этом случае таблица с информацией создается сценарием, а не жестко закодирована в HTML. Вы можете увидеть фактический исходный код, используя "view-source:", за которым следует URL. view-source: https://sp.com.sa/en/tracktrace/?tid=RB961555017SG

Итак, мы хотели бы каким-то образом запустить этот скрипт. Самый простой - использовать «селен», который использует драйвер вашего браузера. Затем просто возьмите загруженный html и прогоните его через BS4. Я заметил, что вы можете использовать более конкретный тег c, а не col-sm-12. Надеюсь, это поможет :)

import bs4
from urllib.request import urlopen as uReq
from urllib.parse import urlencode as uEnc
from bs4 import BeautifulSoup as soup

my_url = 'https://sp.com.sa/en/tracktrace/?tid=RB961555017SG'

from selenium import webdriver
import time

chrome_path = "path of chrome driver that fits your current browser version"
driver = webdriver.Chrome(chrome_path)
driver.get(my_url)
time.sleep(5)                 #to make sure it's loaded
page_html = driver.page_source
driver.quit()

page_soup = soup(page_html, "html.parser") # parsing the html file and saving
updates = page_soup.findAll("table",{"class":"table-shipment table-striped"}) #The table is more specific to you wanted data than the col-sm-12 so I'd rather use that.
print(updates)
...