#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")