Сканирование разных тегов родителей, но одинаковых дочерних тегов - PullRequest
0 голосов
/ 18 мая 2019

Я просматриваю подробные страницы товара в интернет-магазине. Каждый продукт имеет диаграмму, которая имеет разные индексы. например,

продукт 1 Марка: Nike Страна-производитель: Китай

Продукт 2 Марка: Adidas Цена: $ 150

в этом случае для продукта 1 существует индекс под названием «страна-производитель», а для индекса 2 продукта 2 - «цена». Так что это сбивает с толку, что, когда я сканирую, этот столбец называется «Произведенная страна», но в строке 2 - «150 долларов».

Я хочу получить всю эту информацию, но понятия не имею, чтобы получить «страну» и «цену» отдельно. Я использовал код try-кроме, но он все тот же, поэтому, несмотря на то, что я нашел информацию «rel», я не смог получить следующий текст td рядом с тегом td «rel».

составить список tr

  B = A.findAll("tr")
  try:
    B.find("td",{"rel":"brand"})
    C = B.find("td",{"class":"last"})
  except:
    C= ""
  return C


 # Product 1
 <tbody>
  <tr>
   <td rel="brand">brand name</td>
   <td class="last">Nike</td>
  <tr>
   <td rel="country">country name</td>
   <td class="last">China</td>

 # Product 2
 <tbody>
   <tr>
     <td rel="brand">brand name</td>
     <td class="last">Adidas</td>
   <tr>
    <td rel="price">price</td>
    <td class="last">$150</td>

1 Ответ

0 голосов
/ 18 мая 2019

Вы можете использовать цикл for для работы с каждым row (каждым tr) отдельно и получить все td в row и получить text от каждого td. Таким образом, вы работаете с каждой строкой отдельно и можете хранить ее в словаре или в другой структуре.

data = '''<table>
<tr>
   <td rel="brand">brand name</td>
   <td class="last">Nike</td>
</tr>
<tr>
   <td rel="country">country name</td>
   <td class="last">China</td>
</tr>
</table>

<table>
<tr>
     <td rel="brand">brand name</td>
     <td class="last">Adidas</td>
</tr>
<tr>
    <td rel="price">price</td>
    <td class="last">$150</td>
</tr>
</table>
'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'html.parser')

results = []

for table in soup.find_all('table'):
    item = dict()

    for row in table.find_all('tr'):
        tds = row.find_all('td')
        key = tds[0].text
        value = tds[1].text
        item[key] = value

    results.append(item)    

print(results)

Результат:

[
  {'brand name': 'Nike', 'country name': 'China'}, 
  {'brand name': 'Adidas', 'price': '$150'}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...