поиск узлов на основе пользовательского ввода в python3

#python-3.x #xml

#python-3.x #xml

Вопрос:

Код работает хорошо, когда я жестко кодирую узлы (например, node1), но не когда я использую пользовательский ввод — он всегда возвращает 0 вместо подсчета чисел, которые являются «node3». Вот страница, которую я использую http://py4e-data.dr-chuck.net/comments_678016.xml — node1 = комментарии, node2 = комментарий, node3= количество. Есть предложения?

 import urllib.request, urllib.parse, urllib.error
import xml.etree.ElementTree as ET
import ssl

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE


url = input ("Which url?n")
node1 = input ("Enter node1- ")
node2 = input ("Enter node2- ")
node3 = input ("Enter node3- ")
count = 0

try:
    html = urllib.request.urlopen(url, context=ctx).read()
    tree = ET.fromstring(html)
    x = tree.findall(node1/node2)
    for item in x:
        c = int(item.find(node3).text)
        count = count   c
    print(count)
except:
    print("Please only input complete urls")
  

Ответ №1:

Оставляя в стороне угол пользовательского ввода, если вы хотите «суммировать все числа в разделе «count»», измените выражение xpath на

 x = tree.findall('.//comment/count')
  

а затем либо сделайте это длинным путем (который я лично предпочитаю):

 total = 0
for count in x:
    total  = int(count.text)
  

или используйте понимание списка:

 sum([int(count.text) for count in x])
  

В любом случае, результат является

 2348
  

Ответ №2:

Выяснил, в чем была ошибка — необходимо объединить строки: x = tree.findall(node1 «/» node2)

 import urllib.request, urllib.parse, urllib.error
import xml.etree.ElementTree as ET
import ssl

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE


url = input("Which url?n")
node1 = input("Enter node1- ")
node2 = input("Enter node2- ")
node3 = input("Enter node3- ")
count = 0

try:
    html = urllib.request.urlopen(url, context=ctx).read()
    tree = ET.fromstring(html)
    x = tree.findall(node1   "/"   node2)
    for item in x:
        count  = int(item.find(node3).text)
    print(count)

except:
    print("Please only input complete urls")