Как извлечь текст и xpath к этому элементу HTML-страницы в Python

#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 Боюсь, что нет; изменения, которые вы внесли при редактировании вопроса, и новый вопрос в вашем комментарии, вероятно, требуют другого подхода ко всему. Как я уже сказал, лучше всего, если вы отмените редактирование исходного вопроса и опубликуете новый.