Python: Получение значения элемента из XPath

#python #html #web-scraping #xpath #beautifulsoup

Вопрос:

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

Код:

 def xpath_soup(element):
    components = []
    child = element if element.name else element.parent
    for parent in child.parents:

        previous = itertools.islice(parent.children, 0,parent.contents.index(child))
        xpath_tag = child.name
        xpath_index = sum(1 for i in previous if i.name == xpath_tag)   1
        components.append(xpath_tag if xpath_index == 1 else '%s[%d]' % (xpath_tag, xpath_index))
        child = parent
    components.reverse()
    return '/%s' % '/'.join(components)



page = requests.get("https://www.gaumard.com/obstetricmr")
html = str(BeautifulSoup(page.content, 'html.parser'))
soup = BeautifulSoup(html, 'lxml')
elem = soup.find(string=re.compile('xt-generation mixed reality training solution for VICTORIA® S2200 designed to help learners bridge the gap between theory and practice'))
xPathValue = xpath_soup(elem)
print(xPathValue)
 

Я пытаюсь получить полную стоимость элемента, используя xPathValue .

Ожидаемым результатом будет полная версия xt-generation mixed reality training solution for VICTORIA® S2200 designed to help learners bridge the gap between theory and practice

существование

Obstetric MR™ is a next-generation mixed reality training solution for VICTORIA® S2200 designed to help learners bridge the gap between theory and practice faster than ever before. Using the latest technology in holographic visualization, Obstetric MR brings digital learning content into the physical simulation exercise, allowing participants to link knowledge and skill through an entirely new hands-on training experience. The future of labor and delivery simulation is here.

Эта полная стоимость будет получена от использования xPathValue .

Комментарии:

1. Каким должен быть ожидаемый результат?

2. Пост @AndrejKesely был отредактирован

3. Итак, вы хотите использовать Xpath с beautifulsoup ? bs4 имеет свой собственный API или использует селекторы CSS

4. @AndrejKesely для меня действительно не имеет значения, что я использую. Я просто пробовал разные вещи из других вещей, которые я видел в stackoverflow

Ответ №1:

Вот как получить полный текст с помощью an XPath .

 import requests
from lxml import html

page = requests.get("https://www.gaumard.com/obstetricmr").text
text = html.fromstring(page).xpath('//*[@style="margin: 0 auto;"][2]/div/text()')
print(text[0].strip())
 

Выход:

 Obstetric MR™ is a next-generation mixed reality training solution for VICTORIA® S2200 designed to help learners bridge the gap between theory and practice faster than ever before. Using the latest technology in holographic visualization, Obstetric MR brings digital learning content into the physical simulation exercise, allowing participants to link knowledge and skill through an entirely new hands-on training experience. The future of labor and delivery simulation is here.
 

Комментарии:

1. Спасибо за ваш ответ. Это работает, но я пытаюсь автоматизировать создание xpath, чтобы я мог использовать этот код и для других веб-сайтов. Есть ли способ автоматизировать создание //*[@style="margin: 0 auto;"][2]/div/text() ?

2. Веб-сайты разные, и я не думаю, что есть способ автоматически создать действительный XPath.

3. Мой метод здесь состоял в том, чтобы найти, где Obstetric MR™ is a next-generation mixed reality training находится часть строки в html, и найти Xpath на основе этого. Разве это не хороший метод или есть лучший метод?

Ответ №2:

Конкретный XPath не сильно поможет, так как, как уже говорилось, веб-страницы могут отличаться. Универсальный XPath для поиска текстовых узлов и получения массивов или списков узлов, содержащих эту строку, может помочь в некоторой последующей обработке.

Примерка на консоли Firefox:

 nodes = $x('//*[contains(text(),"next-generation mixed reality")]', window.document, "nodes");
<- Array [ div ]

nodes[0].textContent;
<- "Obstetric MR™ is a next-generation...(redacted)"
 

Этот XPath может работать на других страницах
'//*[contains(text(),"next-generation mixed reality")]'
при условии, что они содержат next-generation mixed reality строку.

То же самое с использованием python:

 import requests
from lxml import html
url = 'https://www.gaumard.com/obstetricmr'
response = requests.get(url)
html_doc = response.content
xpath0 = '//*[contains(text(),"next-generation mixed reality")]'
result_arr = html.fromstring(html_doc).xpath(xpath0)
result_arr[0].text
 

Выход:

 'Obstetric MR™ is a next-generation mixed...'
 

Комментарии:

1. Привет, Луис, я немного растерян. Я ищу код на Python, что выше?

2. Это может быть сделано на любом языке, использующем XPath, поэтому ключевым элементом является сам xpath. Дайте мне немного времени, и я добавлю пример python (позже сегодня).

3. @Bob добавил пример python.