Синтаксис XPath: как получить информацию о дочернем элементе div на основе родительского элемента div - PullRequest
2 голосов
/ 03 июля 2019

Результат моего проекта scrapy выглядит следующим образом:

<div class="news_li">...</div>
<div class="news_li">...</div>
<div class="news_li">...</div>
...
<div class="news_li">...</div>

И каждый класс "news_li" выглядит так:

 <div class="news_li">
    <div class="a">
        <a href="aaa">
            <div class="a1"></div>
        </a>
    </div>
    <a href="xxx">
        <div class="b">
            <div class="b1"></div>
            <div class="b2"></div>
            <div class="b3"></div>
        </div>
    </a>
</div>

Я пытаюсь извлечь информацию по одномувремя в оболочке scrapy с помощью следующей команды:

response.xpath("//div[@class='news_li']")[0].xpath("//div[@class='a1']").extract()
response.xpath("//div[@class='news_li  ']/descendant::div[@class='a1']").extract()

Но эти команды возвращают меня со всем классом "a1" из всех других классов "news_li"

У меня есть 2 вопроса:

  1. Как я могу получить информацию о дочерних элементах по одному.

  2. Как получить <a href="aaa"> </a> and <a href="xxx"> </a> отдельно?(Разница в том, что первый из них оборачивается в родительский div, а второй - сам по себе.)

Большое Большое спасибо заранее.

Редактировать: Бытьконкретный, как я могу извлечь информацию зависит от родительского / корневого узла?Я смотрю Оси XPath и пробовал с "потомком", но он не работает.

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Вот что вы можете попробовать

response.xpath("(//div[@class='news_li'])[0]").xpath("//div[@class='a1']").extract()

Используйте [0] непосредственно в XPath.

0 голосов
/ 03 июля 2019

Весьма вероятно, что при объединении выражений XPath, например, так:

response.xpath("//div[@class='news_li']")[0].xpath("//div[@class='a1']").extract()

если второе выражение начинается с двойной косой черты //, то элементы выбираются в любом месте документа , независимо от того, что было выбрано ранее. Проще говоря: даже если первое выражение:

//div[@class='news_li']

выбирает только div элементов с определенным атрибутом класса, следующий:

//div[@class='a1']

выделяет все div элементов, где @class='a1' во всем документе. Кажется, это твоя проблема.

Решение: используйте относительный путь

Одним из возможных решений является использование относительного выражения пути, которое не начинается с //:

response.xpath("//div[@class='news_li']")[0].xpath(".//div[@class='a1']").extract()

Общие замечания

В зависимости от структуры ваших фактических документов и если вы можете сделать определенные предположения, могут быть найдены лучшие решения.

Кроме того, в общем случае для обработки результатов "по одному" необходимо

  • написать выражение XPath, которое выбирает все нужные элементы и возвращает их в виде списка
  • обрабатывает каждый элемент в этом списке индивидуально, например, с кодом Python
0 голосов
/ 03 июля 2019

Попробуйте с приведенным ниже.

# first link
response.xpath("(//div[@class='news_li']//a)[1]").extract()
# second link
response.xpath("(//div[@class='news_li']//a)[2]").extract()

Редактировать 1:

 # change the X value in the below xpath to get the first link
//div[@class='news_li'][X]/descendant::div[@class='a1']/parent::a

 # change the X value in the below xpath to get the second link (direct
 # link) based on the child div
 //div[@class='news_li'][X]/descendant::a[div[@class='b']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...