получить элемент и изменить текст элемента с помощью python и lxml - PullRequest
2 голосов
/ 16 сентября 2011

Во-первых, я знаю, что в StackOverflow уже есть много вопросов, касающихся python и lxml, и я прочитал большинство из них, если не все.Сейчас я ищу более исчерпывающий ответ на этот вопрос.

Я выполняю некоторые преобразования HTML, и мне нужно грамматически проанализировать HTML, а затем внести некоторые изменения содержимого в href, img и т. Д..

Это упрощенная версия того, что у меня есть сейчас:

with open(fileName, "r") as inFile:
    inputS = inFile.read()

myTree = fromstring(inputS) #parse etree from HTML content

breadCrumb = myTree.get_element_by_id("breadcrumb") #a list of elements with matching id
breadCrumbContent = breadCrumb[0].text_content().strip() #text content of bread crumb

h1 = myTree.xpath('//h1') #another way, get elements by xpath
h1Content = h1[0].text_content().strip() #get text content

getTail = myTree.cssselect('table.results > tr > td > a + span + br') #get list of elements using css select

Так что в основном это то, что я знаю на данный момент.Есть ли другие способы получить элементы / атрибуты, используя lxml?Я знаю, что они могут быть не лучшим способом сделать это, но терпите меня, я новичок во всем этом.

Следующее - это то, что я хочу сделать.У меня есть:

<img src="images/macmail10.gif" alt="" width="555" height="485" /><br />
<a href="http://www.some_url.com/faq/general_faq.html" target="_blank">General FAQs page</a>

Они могут быть вложены в другие элементы, такие как div, p.Что я хочу сделать, так это программно искать эти элементы;для изображения я хочу извлечь src, сделать некоторые манипуляции с ним и установить src на что-то другое (например, src="images/something.jpg" в src="something_images.jpg"), то же самое с href, я хочу изменитьчтобы указать на другое место.

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

<head>
    <title>something goes here</title>
</head>
<div>
    <p id="some_p"> Some content </p>
</div>

Я хотел бы удалитьголовной узел и div, я смог бы получить p с id="some_p", есть ли способы получить родительский элемент?Есть ли способ удалить эти элементы?(в этом случае найдите head, удалите head, а затем найдите id="some_p", получите parent и удалите его.

Спасибо!

========================================================

ОБНОВЛЕНИЕ: Я уже нашел решение этой проблемы и уже закончил кодирование с использованием lxml.etree. Я опубликую ответ на него, как только мне позволит stackoverflow. Я искренне надеюсь, что ответ на этот вопрос поможет другим людям.когда им приходится иметь дело с разбором HTML!

1 Ответ

1 голос
/ 17 сентября 2011

lxml и ElementTree очень похожи . Часть ElementTree сайта документации lxml, фактически, просто указывает на документацию ElementTree.

Вы можете попробовать пройти через учебники и примеры ElementTree внизу страницы обзора. Поскольку ElementTree является частью дистрибутива Python, он, как правило, широко документирован (и легко гуглится). Как только вы это сделаете, добавьте немного магии lmlx, изначально не найденной в ElementTree, если вам нужно. Например, lxml поддерживает родительские отношения для каждого элемента, а ElementTree - нет. Вы можете добавить родительские отношения в ElementTree, но это не простой пример для начала.

Вот как я это узнал.

...