Как использовать FindAll при веб-очистке - PullRequest
1 голос
/ 10 октября 2019

Я хочу очистить https://www.ebay.co.uk/sch/i.html?_from=R40&_sacat=0&_nkw=xbox&_pgn=2&_skc=50&rt=nc и получить плитки (черная консоль Microsoft Xbox 360 E 250 ГБ, белая консоль Microsoft Xbox One S 1 ТБ с 2 беспроводными контроллерами и т. Д.). Со временем я хочу передать скрипту Python различные URL-адреса eBay, но ради этого вопроса я просто хочу сосредоточиться на одном конкретном URL-адресе eBay.

Затем я хочу добавить их заголовки к фрейму данных, который я бы записал в Excel. Я думаю, что могу сделать эту часть сам.

Не работал -

for post in soup.findAll('a',id='ListViewInner'):
    print (post.get('href'))

Не работал -

for post in soup.findAll('a',id='body'):
      print (post.get('href'))

Не работал -

for post in soup.findAll('a',id='body'):
   print (post.get('href'))

h1 = soup.find("a",{"class":"lvtitle"})
print(h1)

Не работал -

for post in soup.findAll('a',attrs={"class":"left-center"}):
    print (post.get('href'))

Не сработало -

for post in soup.findAll('a',{'id':'ListViewInner'}):
    print (post.get('href'))

Это дало мне ссылки на неправильные части веб-страницы, я знаю, что href - это гиперссылки, а не заголовки, но я решил, что приведенный ниже код имеетработал, я мог бы изменить его для заголовков -

for post in soup.findAll('a'):
    print (post.get('href'))

Вот весь мой код -

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import urllib.request
from bs4 import BeautifulSoup

#BaseURL, Syntax1 and Syntax2 should be standard across all
#Ebay URLs, whereas Request and PageNumber can change 

BaseURL = "https://www.ebay.co.uk/sch/i.html?_from=R40&_sacat=0&_nkw="

Syntax1 = "&_skc=50&rt=nc"

Request = "xbox"

Syntax2  = "&_pgn="

PageNumber ="2"

URL = BaseURL + Request + Syntax2 + PageNumber + Syntax1


print (URL)
HTML = urllib.request.urlopen(URL).read()

#print(HTML)

soup=b(HTML,"html.parser")

#print (soup)

for post in soup.findAll('a'):
    print (post.get('href'))

1 Ответ

1 голос
/ 10 октября 2019

Используйте css-селектор, который намного быстрее.

import requests
from bs4 import  BeautifulSoup

url = 'https://www.ebay.co.uk/sch/i.html?_from=R40&_sacat=0&_nkw=xbox&_pgn=2&_skc=50&rt=nc'
Res = requests.get(url)
soup = BeautifulSoup(Res.text,'html.parser')
for post in soup.select("#ListViewInner a"):
    print(post.get('href'))

Используйте функцию format() вместо строки конкатенации.

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import urllib.request
from bs4 import BeautifulSoup

BaseURL = "https://www.ebay.co.uk/sch/i.html?_from=R40&_sacat=0&_nkw={}&_pgn={}&_skc={}&rt={}"

skc = "50"
rt = "nc"
Request = "xbox"
PageNumber = "2"

URL = BaseURL.format(Request,PageNumber,skc,rt)
print(URL)
HTML = urllib.request.urlopen(URL).read()
soup = BeautifulSoup(HTML,"html.parser")
for post in soup.select('#ListViewInner a'):
    print(post.get('href'))
...