Как получить конкретную строку в xml с помощью python или perl и т. Д.

Я думаю, что отследил это. Возможно, это ошибка в trickle, возникшая в результате ползучего фичуризма в библиотечном вызове socket().

Код trickle переопределяет socket(), как вы знаете. В верхней части его переопределения в файле trickle-overload.c есть проверка, включающая type == SOCK_STREAM, так что только соединения типа SOCK_STREAM имеют право на обработку.

Код ruby открывает сокет с type = SOCK_STREAM | SOCK_CLOEXEC. SOCK_CLOEXEC - это расширение Linux (начиная с версии 2.6.27), которое позволяет избежать использования последующего вызова fcntl для установки флага close-on-exec.

К сожалению, SOCK_STREAM - это не то же самое, что SOCK_STREAM | SOCK_CLOEXEC, поэтому обработка trickle не будет происходить, пока его код не будет исправлен, чтобы разрешить расширения, которые теперь разрешены в поле socket type.

Я не знаю никакого обходного пути, кроме как перекомпилировать trickle для вашей системы с измененным сравнением типов сокетов.

(Я отправил сообщение об ошибке в Debian Bugs, поскольку это моя предпочтительная платформа.)

.

3
20.11.2018, 22:30
5 ответов

Для этого я использую BeautifulSoup

Если вы устанавливаете с помощью pip, следуйте следующей инструкции

pip install bs4

Вы можете проверить это в интерактивной оболочке Python

>>> from bs4 import BeautifulSoup as Soup
>>> content = """<user>
...     <login>pelech</login>
...     <password>passwords are saved outside</password>
... </user>"""
>>> soup = Soup(content, "html.parser")
>>> soup.find_all("login")
[<login>pelech</login>]
>>> soup.find("login").text
'pelech'

Я использую html.parser по умолчанию. Если у вас есть трудности с его правильным разбором, вы можете вместо этого использовать lxml.

Для полноты картины вы можете просто просмотреть список, возвращенный изsoup.find_all("login")

>>> for login in soup.find_all("login"):
...   print(login.text)
... 
pelech

Как вариант, питонический способ

>>> usernames = [login.text for login in soup.find_all("login")]
>>> usernames
['pelech']

Для получения дополнительной информации см. https://www.crummy.com/software/BeautifulSoup/bs4/doc/

.
4
27.01.2020, 21:08

Если вы используете ОС Linux -простоеxmlstarletрешение:

xmlstarlet sel -t -v "//user/login" -n users.xml
6
27.01.2020, 21:08

Я могу только предположить, что ваш XML отформатирован аналогично

<users>
    <user>
    <login>pelech 1</login>
    <password>passwords are saved outside</password>
</user>
<user>
    <login>pelech 2</login>
    <password>passwords are saved outside</password>
</user>

Сначала вам нужно найти свой тег входа в систему, а затем вам нужно захватить текст этого тега, когда он повторяется внутри вашего цикла.

import xml.etree.ElementTree as ET

tree = ET.parse("users.xml")
root = tree.getroot()
for app in root.findall('user'):
    for l in app.findall('login'):
       print("%s" % (l.text));

Используя этот XML в качестве примера, у меня это работает нормально.

4
27.01.2020, 21:08

Если ваш файл гарантированно будет в этом формате с логином внутри тегов в отдельной строке, вам не нужны библиотеки xml и можно сделать простой

sed -n 's_ *</*login>__gp' your.xml

Это удалит теги и начальные пробелы из этой строки и напечатает оставшееся (имя пользователя! ), а все остальные строки подавляются опцией -n.

1
27.01.2020, 21:08

использовать модуль lxml

<user>
    <login>pelech</login>
    <password>passwords are saved outside</password>
</user>

Следующий код извлечет pelech из xml

from lxml import etree

document = etree.parse(open("users.xml"))
user = etree.xpath("//login")[0].text    #user will have value pelech

узнайте больше о xpath и lxml

0
27.01.2020, 21:08

Теги

Похожие вопросы