BeaufifulSoup, l xml навигация для тега со знаком "-" в имени тега? - PullRequest
0 голосов
/ 17 июня 2020
<body>
<response status="success">
<policy>
<shared/>
<panorama>
<address>
    <entry name="text">
    <tag1></tag1>>
    <tag2></tag2>
    </entry>>
</address>
<service>
....
</service>
<pre-rulebase>
</pre-rulebase>
<security>
<rules>
    <entry name="some text">
    <tag1>text</tag1>>
    <tag2>text</tag2>
    </entry>
    <entry name="more text">
    <tag1>text</tag1>
    <tag2>text</tag2>
    </entry>
    ...
    </rules>
</security>
<post-rulebase>
    <entry name="some text">
    <tag1>text</tag1>>
    <tag2>text</tag2>
    </entry>
    <entry name="more text">
    <tag1>text</tag1>>
    <tag2>text</tag2>
    </entry>
</post-rulebase>
</panorama>
</policy>
</response> 
</body>

Привет,

Я пытаюсь проанализировать вышеуказанный xml файл, используя Python BeautifulSoup и l xml. Обычно я перехожу к элементу с помощью '.'. например,

from bs4 import BeautifulSoup
with open('sample.xml', 'r') as xml_file:
    soup = BeautifulSoup(xml_file, 'lxml')

for item in soup.body.response.policy.panorama.address.find('entry'):
    <some code action>

Моя проблема связана с навигацией по указанным выше тегам, таким как '' и ''. Поскольку в названии тега стоит «-», символ «.» навигация не работает. Кроме того, поскольку дочерние теги имеют одинаковые имена, я не могу использовать его прямой поиск. Как я могу перемещаться и перебирать теги в тегах '' ie ''?

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Вероятно, вы можете сделать это так:

from lxml import etree
rules = """[your xml, fixed]"""
doc = etree.XML(rules)
for i in doc.xpath('//post-rulebase//entry'):
    print(i.tag,i.attrib['name'])
    for t in i.xpath('.//*'):
        print(t.tag,t.text)

Вывод:

entry some text
tag1 text
tag2 text
entry more text
tag1 text
tag2 text
0 голосов
/ 18 июня 2020

Другой метод.

from simplified_scrapy import SimplifiedDoc, req, utils
html = '''
<address>
    <entry name="text">
    <tag1></tag1>>
    <tag2></tag2>
    </entry>>
</address>
<service>
....
</service>
<post-rulebase>
    <entry name="some text">
    <tag1>text</tag1>>
    <tag2>text</tag2>
    </entry>
    <entry name="more text">
    <tag1>text</tag1>>
    <tag2>text</tag2>
    </entry>
</post-rulebase>'''
doc = SimplifiedDoc(html)
entry = doc.select('post-rulebase').entry
print(entry)
print(entry.children.text)

Результат:

{'name': 'some text', 'tag': 'entry', 'html': '\n    <tag1>text</tag1>>\n    <tag2>text</tag2>\n    '}
['text', 'text']

Вот еще примеры: https://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples

...