Scrapy: как создать вывод dict с XPATH итерацией в таблице <tr><td> - PullRequest
0 голосов
/ 11 июля 2020

У меня есть эта html структура:

<table>
  <tbody>
    <tr>....</tr>
    <tr>....</tr>
    <tr>....</tr>
      <td align= "right" bgcolor="#ffffff">...</td>
      <td bgcolor="efefef">...</td>
      <td align= "right" bgcolor="#ffffff">...</td>
      <td bgcolor="efefef">...</td>
    <tr>....</tr>

В таблице каждый tr имеет 4 td, мне нужно создать выходной dict, что текст в первом td является ключом, второй значение для этого ключа, третий - новый ключ, а четвертый - значение для этого ключа. И сделайте это для каждого tr в таблице.

Я пробовал это на своем пауке:

это XPATH для таблицы: / html / body / table [3] / tbody / tr / td [1] / table / tbody / tr

def parse(self, response):
        
        for row in response.xpath('/html/body/table[3]/tbody/tr/td[1]/table/tbody/tr'):

           key1 = row.xpath("/td[0][@align='right']/font[@size='2']/text()").extract()
           value1 = row.xpath("/td[1]/[@bgcolor='#efefef']/descendant::text()").extract()
           key2 = row.xpath("/td[2][@align='right']/font[@size='2']/text()").extract()
           value2 = row.xpath("/td[3]/[@bgcolor='#efefef']/descendant::text()").extract()

            yield{
                key1 : value1,
                key2 : value2
            }

Пробовал, но не работает. Я новичок в XPATH и scrapy, я не знаю, как делать такие вещи. Я извлек ключи и значения в отдельные массивы, но этот способ не решает мою проблему, мне нужно извлечь их с соответствующей парой ключ-значение.

1 Ответ

1 голос
/ 11 июля 2020

Вот пример. Возможно, вам придется немного его адаптировать. Предполагая, что это ваши данные:

<table>
   <tr>
      <td align= "right" bgcolor="#ffffff">a</td>
      <td bgcolor="efefef">1</td>
      <td align= "right" bgcolor="#ffffff">b</td>
      <td bgcolor="efefef">2</td>
   </tr>
   <tr>
      <td align= "right" bgcolor="#ffffff">c</td>
      <td bgcolor="efefef">3</td>
      <td align= "right" bgcolor="#ffffff">d</td>
      <td bgcolor="efefef">4</td>
   </tr>
   <tr>
      <td align= "right" bgcolor="#ffffff">e</td>
      <td bgcolor="efefef">5</td>
      <td align= "right" bgcolor="#ffffff">f</td>
      <td bgcolor="efefef">6</td>
   </tr>
   <tr>
      <td align= "right" bgcolor="#ffffff">g</td>
      <td bgcolor="efefef">7</td>
      <td align= "right" bgcolor="#ffffff">h</td>
      <td bgcolor="efefef">8</td>
   </tr>
</table>

Вы можете написать что-то вроде (не забудьте . в начале выражения XPath на этапе l oop):

# Variables declaration, XPath, and loop+fill. We select the keys and the values in each tr at the same time.

key=[]
value=[]
for items in response.xpath("//table/tr"):
    key.append(items.xpath("./td[position()=1 or position()=3]").getall())
    value.append(items.xpath("./td[position()=2 or position()=4]").getall())

# Flatten the lists and extract the text :

keys = [item.text for sublist in key for item in sublist]
values = [item.text for sublist in value for item in sublist]

# Create the dictionnary :

dictionary = dict(zip(keys, values))
print(dictionary)

Вывод:

{'a': '1', 'b': '2', 'c': '3', 'd': '4', 'e': '5', 'f': '6', 'g': '7', 'h': '8'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...