Разбор классов Python - PullRequest
       4

Разбор классов Python

0 голосов
/ 26 ноября 2018

Я хочу получить product_list, анализируя веб-сайт

soup = bs(product_list_get.text, 'html.parser')
productlist = soup.find_all('td',{'class':'txtCode'})

некоторая часть результата выглядит следующим образом

[<td class="txtCode"><a class="txtLink eProductDetail _product_code" href="/disp/admin/shop1/product/ProductRegister?product_no=42" product_no="42" target="_blank" title="새창 열림">P00000BQ</a></td>, <td class="txtCode"><a class="txtLink eProductDetail _product_code" href="/disp/admin/shop1/product/ProductRegister?product_no=41" product_no="41" target="_blank" title="새창 열림">P00000BP</a></td>

что я хочу получить, это список product_no

так что оптимальный результат будет

[42,41]

Я пытался

productlist = soup.find_all('td',{'class':'txtCode'}).get('product_no')

, но результат

AttributeError: ResultSet object has no attribute 'get'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?

Может кто-нибудь любезно подсказать мне, как бороться сэто?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

product_no содержится внутри href, поэтому вам нужно извлечь href.Тогда вы можете использовать регулярное выражение для соответствия product_no

from bs4 import BeautifulSoup
import re

lists = [
"""<td class="txtCode"><a class="txtLink eProductDetail _product_code" href="/disp/admin/shop1/product/ProductRegister?product_no=42" product_no="42" target="_blank" title="새창 열림">P00000BQ</a></td>""", 
"""<td class="txtCode"><a class="txtLink eProductDetail _product_code" href="/disp/admin/shop1/product/ProductRegister?product_no=41" product_no="41" target="_blank" title="새창 열림">P00000BP</a></td>"""]

for each in lists:
    soup = BeautifulSoup(each,"lxml")
    href = soup.a.get("href")
    product_no = re.search(r"(?<=product_no=)\w+",href).group(0)
    print(product_no)
#42
#41
0 голосов
/ 26 ноября 2018

Метод find_all возвращает список элементов Tag.Таким образом, ваш код productlist = soup.find_all('td',{'class':'txtCode'}) возвращает список <td> элементов.Вы хотите получить атрибут number_no внутреннего <a> элемента для каждого найденного <td>.

Выполните итерацию по productlist и получите доступ к number_no.

productlist = soup.find_all('td', {'class':'txtCode'})
product_nos = [int(p.find('a').get('product_no')) for p in productlist]

Кроме того, вы можете найти <a> элементов, которые содержат атрибут product_no.

results = soup.find_all('a', {'product_no':True})
product_nos = [int(r.get('product_no')) for r in results]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...