Выберите элементы li из ul с помощью xpath - PullRequest
0 голосов
/ 30 августа 2018

Я начинаю с XPATH с lxml на Python3 и не могу получить правильный синтаксис для выбора всех li элементов с содержанием ul. Я пытаюсь с этой структурой:

<body>
 <div> ..... </div>
 <div> ..... </div>
 <div id="div-A">
  <div id="subdiv-1">
   <form> ... </form>
   <div> ..... </div>
   <div> ..... </div>
   <ul>
    <li>
     <div id="div-1">
      <div> ..... </div>
      <div> ..... </div>
      <div id="subdiv-1">
       <a class="name">
        <span>
          ....text1....
        </span>
       </a>
      </div>
      <div id="subdiv-2">
       <div class="class-1">
        <div class="subClass-1">
         <div> ....text2.... </div>
        </div>
        <span class="subClass-2">
         ....text3....
        </span>
       </div>
      </div>
     </div>
    </li>
    ... x23...
   </ul>
  </div>
 </div>
</body>

Моя цель - получить text1 , text2 и text3 .

Итак, сначала я пытаюсь получить все элементы li с их содержимым:

content = html_response.content
fixed_content = fromstring(content)  # parse the HTML and correct malformed HTML
items = fixed_content.xpath('//ul/li/*')

И передать items в функцию с циклом for для итерации 23 li элементов. Сейчас я пытаюсь получить тексты, так:

for item in items:
 text1 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-1"]/a[@class="name"]/span').text_content()
 text2 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-1"]/div').text_content()
 text3 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-2"]/span[@class="subClass-2"]').text_content()

Но я получаю во всех случаях пустой результат без содержания. Что я делаю не так?

Привет.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Попробуйте следующий код, чтобы получить требуемый вывод:

items = fixed_content.xpath('//ul/li//span | //ul/li//div[@class="subClass-1"]')
for item in items:
    item.text_content().strip()

Выход

'....text1....'
'....text2....'
'....text3....'

или

items = fixed_content.xpath('//ul/li') 
for item in items:
    text1 = item.xpath('.//a[@class="name"]/span')[0].text_content().strip()
    text2 = item.xpath('.//div[@class="subClass-1"]')[0].text_content().strip()
    text3 = item.xpath('.//span[@class="subClass-2"]')[0].text_content().strip()

если вы хотите получить каждый текстовый узел как переменную

0 голосов
/ 30 августа 2018
[i.strip() for i in tree.xpath('//ul//div[@class="subClass-1"]//text()|//ul//span//text()') if i.strip()]
0 голосов
/ 30 августа 2018

Ваши запросы xpath, похоже, дают мне желаемый результат. text1, text2 и text3 получаются при их полном написании. С помощью метода string () вы можете выбрать внутреннее текстовое значение найденного элемента:

//ul/li/div[@id="div-1"]/div[@id="subdiv-1"]/a[@class="name"]/span/string(),
//ul/li/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-1"]/div/string(),
//ul/li/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/span[@class="subClass-2"]/string()

Разве их запись и использование метода string () не обеспечивают ожидаемые значения text1-3 для вас?

...