Веб-сайт, который нужно очистить, имеет разные имена классов - PullRequest
3 голосов
/ 16 марта 2019

Я пытаюсь очистить название и цену продукта. Я сталкиваюсь с проблемой, когда у сайта есть класс, который изменяется. Это пример,

<a class="G-ab" href="thewebsite.com"><div class="G-l"><div class="G-m">Product Name</div></div><div class="G-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>

Когда я использую другой компьютер, он показывает это вместо

<a class="K-ab" href="thewebsite.com"><div class="K-l"><div class="K-m">Product Name</div></div><div class="K-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>

Я понял, что они меняют свои классы на случайные буквы. В настоящее время я использую BeautifulSoup4 и библиотеку запросов. Есть ли способы получить класс, кроме мысли сделать целые длинные классы "если-элиф"? Сайт, который я пытаюсь почистить, - carousell.com. В настоящее время я использую анализатор lxml, если это поможет. Спасибо за ваше время.

Ответы [ 3 ]

2 голосов
/ 16 марта 2019

BeautifulSoup позволяет использовать регулярное выражение в качестве фильтра .На вашем сайте имена классов тега a содержат -ab.

Вы можете использовать

soup.find_all('a',class_=re.compile("-ab"))

Но в некоторых случаях в именах классов не должно быть общих терминов, вы можете проверить, можете ли вы попытаться использовать методы в взад и вперед , Переход в сторону , Переход вниз и Переход вверх по разделам документации, чтобы каким-то образом уникальным образом идентифицировать необходимый элемент, не полагаясь на классname.

Возвращаясь к вашему вопросу

html="""
<a class="G-ab" href="thewebsite.com"><div class="G-l"><div class="G-m">Product Name</div></div><div class="G-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>
<a class="K-ab" href="thewebsite.com"><div class="K-l"><div class="K-m">Product Name</div></div><div class="K-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>
"""
from bs4 import BeautifulSoup
import re
soup=BeautifulSoup(html,'html.parser')
a_links=soup.find_all('a',class_=re.compile("-ab"))
print(a_links)

Выходы:

[<a class="G-ab" href="thewebsite.com"><div class="G-l"><div class="G-m">Product Name</div></div><div class="G-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>, <a class="K-ab" href="thewebsite.com"><div class="K-l"><div class="K-m">Product Name</div></div><div class="K-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>]

Были выбраны оба тега a с разными именами классов, содержащие -ab.

1 голос
/ 16 марта 2019

Вы можете использовать атрибут = селектор значений с оканчивающимся $ operator

items = soup.select("a[class$='-ab']")
1 голос
/ 16 марта 2019

Да, то, что упомянуто @Bitto, является правильным. Вы должны использовать регулярное выражение для идентификации уникальных элементов. Используя re, вы можете достичь этого. Однако здесь есть ваш код. Вы можете использовать pandas Dataframe для печати результатов.

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

html=requests.get("https://carousell.com/search/products/?cc_id=2195&query=I7&sort_by=time_created%2Cdescending")
soup=BeautifulSoup(html.text,"html.parser")
atag=soup.find_all('a', class_=re.compile("-ab"))
itemtitle=[]
itemprice=[]
for a in atag:
  for title,price in zip(a.find_all('div', class_=re.compile("-m")),a.find_all('div', class_=re.compile("-k"))):
      itemtitle.append(title.text)
      itemprice.append(price.find('div').text)

df=pd.DataFrame({"Title" :itemtitle, "Price" : itemprice})
print(df)

Вывод:

     Price                                              Title
0     £200                          Acer Aspire Laptop (Used)
1     £700            MSI GP62 LEOPARD i7 12gb Ram windows 10
2     £120                                  Apple MacBook Pro
3     £155                                      iPhone 7 Plus
4     £155                                   Goophone I7 Plus
5     £579  MacBook Air 13.3inch 2014 i7 1.7GHz 8GB Ram 12...
6     £550                          MacBook Pro 2016 16GB Ram
7     £600                    CUSTOM GAMING/MEDIA PC COMPUTER
8     £900     MS I GE62 2QF-419UK APACHE/PRO TRUE FIRE POWER
9     £390           HP Envy 15 Intel Core i7 4000MQ 12GB Ram
10    £188                                   Goophone I7 Plus
11    £650                 Apple IMac 27" i7 2.8Ghz Quad Core
12    £600             Custom Gaming Pc (Excellent Condition)
13    £499               iMac 21.5inch with wireless keyboard
14  £1,299             MacBook Pro Retina 13 Inches AppleCare
15    £700                              I7 4790k Water Cooled
16    £650                                     Gigabyte P15V2
17    £280                                 Two Monitors i7 PC
18    £250                                  Gaming laptop pro
19  £1,000                              MAC BOOK PRO 15 Ritna
20    £550  Apple MacBook Pro Laptop - A1286 15.2" 500 GB ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...