#python #html #xpath #web-scraping #lxml
#python #HTML #xpath #веб-очистка #lxml
Вопрос:
Я работаю над проектом Django, где мне нужно извлечь все текстовые элементы и XPath к этому элементу. Например:
<html>
<head>
<title>
The Demo page
</title>
</head>
<body>
<div>
<section>
<h1> Hello world
</h1>
</section>
<div>
<p>
Hope you all are doing well,
</p>
</div>
<div>
<p>
This is the example HTML
</p>
</div>
</div>
</body>
</html>
Вывод должен быть примерно таким:
/head/title: The Demo Page
/body/div/section/h1: Hello world!
/body/div/div[1]/p: Hope you all are doing well,
/body/div/div[2]/p: This is the example HTML
Ответ №1:
Что-то вроде этого должно работать:
from lxml import etree
html = """[your html above]"""
root = etree.fromstring(html)
targets = root.xpath('//text()[normalize-space()]/..')
tree = etree.ElementTree(root)
for target in targets:
print(tree.getpath(target),target.text.strip())
Вывод:
/html/head/title The Demo page
/html/body/div/section/h1 Hello world
/html/body/div/div[1]/p Hope you all are doing well,
/html/body/div/div[2]/p This is the example HTML
Комментарии:
1. Ваш ответ отлично сработал для приведенного выше HTML, но он терпит неудачу, если текст в
<p>
теге имеет вид<div><p><span>This is the</span> example HTML</p></div>
2. Как мы можем получить этот текст в виде
<span>This is the </span> example HTML
3. @ShahidTariq Во-первых,
<span>
в вашем примере html нет. Во-вторых, в любом случае, это другой вопрос, и в соответствии с политикой StackOverflow вам, вероятно, следует опубликовать его как еще один вопрос с новым образцом html.4. Спасибо! но в любом случае мы будем признательны, если вы поможете ответить на этот вопрос здесь.
5. @ShahidTariq Боюсь, что нет; изменения, которые вы внесли при редактировании вопроса, и новый вопрос в вашем комментарии, вероятно, требуют другого подхода ко всему. Как я уже сказал, лучше всего, если вы отмените редактирование исходного вопроса и опубликуете новый.