Как получить желаемый тег с дочерними тегами с помощью lxml? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть XML-файл, например,

<?xml version="1.0" encoding="utf-8"?>
<source>
<publisher>Job App</publisher>
<publisherurl>https://jldfsfsd.jlfdfs.com/Jobs/</publisherurl>
<lastBuildDate>10-19-2015 00:00:00</lastBuildDate>
<job>
    <title><![CDATA[Barista/Sandwich Prep]]></title>
    <date><![CDATA[10-19-2015]]></date>
    <referencenumber><![CDATA[83]]></referencenumber>
    <url><![CDATA[https://test/Jobs/Job.aspx?JobPostingId=83&SourceId=3]]></url>
    <company><![CDATA[Another Cafe]]></company>
    <city><![CDATA[San Francisco]]></city>
    <state><![CDATA[California]]></state>
    <country><![CDATA[United States of America]]></country>
    <postalcode><![CDATA[94123]]></postalcode>
    <description><![CDATA[  TESTTESTTESTTESTTESTTESTTESTTEST <br> STEdsasjflsdf<p> dfjhdjlas </p>]]></description> 
</job>
<job>
    <title><![CDATA[MV Drivers]]></title>
    <date><![CDATA[01-01-1900]]></date>
    <referencenumber><![CDATA[147]]></referencenumber>
    <url><![CDATA[https://sdf.dsfs.com/Jobs/Job.aspx?JobPostingId=147&SourceId=3]]></url>
    <company><![CDATA[Papa Johns Pizza]]></company>
    <city><![CDATA[Mountain View]]></city>
    <state><![CDATA[California]]></state>
    <country><![CDATA[United States of America]]></country>
    <book><![CDATA[BOOKTEST]]></book>
    <postalcode><![CDATA[94404]]></postalcode>
    <description><![CDATA[Fun sfsf job while makingfsfup to $20/hour!]]></description>    
</job>


В парсере lxml как получить только 2-й тег задания с его дочерними узлами, я просто хочу получить следующееданные в качестве вывода. Обратите внимание, что это не фиксированный формат, это зависит от структуры файла XML.

      <job>
        <title><![CDATA[MV Drivers]]></title>
        <date><![CDATA[01-01-1900]]></date>
        <referencenumber><![CDATA[147]]></referencenumber>
        <url><![CDATA[https://sdf.dsfs.com/Jobs/Job.aspx?JobPostingId=147&SourceId=3]]></url>
        <company><![CDATA[Papa Johns Pizza]]></company>
        <city><![CDATA[Mountain View]]></city>
        <state><![CDATA[California]]></state>
        <country><![CDATA[United States of America]]></country>
        <postalcode><![CDATA[94404]]></postalcode>
        <description><![CDATA[Fun sfsf job while makingfsfup to $20/hour!]]></description>    
    </job>

1 Ответ

1 голос
/ 30 сентября 2019

Вы можете перебирать элементы вашего документа и извлекать второй элемент 'job'. Это очень просто, используя метод iter класса Element.

from lxml import etree

tree = etree.parse('data.xml') #or whatever is your file name
root = tree.getroot()
job_elements = list(root.iter('job'))

job_elements - это список со всеми элементами, помеченными 'job', в порядке появления в документе. Возьмем второй (индекс 1).
Чтобы напечатать его (со всеми его подэлементами), вы можете использовать функцию etree.tostring. Это вернет двоичную строку, поэтому для корректного отображения ее на консоли вам может понадобиться декодировать ее в ascii.

output = etree.tostring(job_elements[1], pretty_print=True)
print(output.decode('ascii'))

Подробнее

etree.parse() возвращает объект ElementTreegetroot() вы получаете объект Element, начиная с корня ElementTreeElement есть больше методов). Эта строка на самом деле не нужна, так как вам нужен метод iter, а ElementTree также имеет метод iter, я добавил это просто как привычку. Однако, если вы захотите сделать некоторые дополнительные манипуляции с деревом, может быть полезно иметь Element, а не ElementTree.

job_elements = list(root.iter('job')) Ключ - iter метод ,Он возвращает итератор по элементам в поддереве в порядке документа (более подробную информацию см. В связанных документах).

...