Почему вместо text я получаю None?
У меня есть вот такая таблица
<yml_catalog date="2021-01-08 05:00:24">
<shop>
<name>ISSA PLUS</name>
<company>ISSA PLUS</company>
<url>https://issaplus.com/</url>
<currencies>
<currency id="RUB" rate="0.3500000000"/>
<currency id="UAH" rate="1.0000000000"/>
<currency id="USD" rate="30.0000000000"/>
</currencies>
<categories>
<category id="25" parentId="19">Платья</category>
<category id="28" parentId="19">Юбки</category>
</categories>
<offers>
<offer available="true" group_id="1245" id="6549">
<url>https://issaplus.com/plate-417-417_print</url>
<price>405</price>
<old_price>675</old_price>
<currencyId>UAH</currencyId>
<picture>https://issaplus.com/wa-data/public/shop/products/45/12/1245/images/334/334.602x0.jpg</picture>
<picture>https://issaplus.com/wa-data/public/shop/products/45/12/1245/images/335/335.602x0.jpg</picture>
<name>Платья ISSA PLUS 417 XS принт</name>
<description><![CDATA[<p>Стильное платье выполнено из натурального трикотажа в яркой цветочной расцветке. Горловина – округлая. Сзади потайная молния. Длина платья макси. </p>]]></description>
<vendor>ISSA PLUS</vendor>
<vendorCode>417_принт</vendorCode>
<categoryId>25</categoryId>
<param name="Стиль">Вечерний</param>
<param name="Вид">Платья</param>
<param name="Размер">XS</param>
<param name="Цвет">принт</param>
<param name="Коллекция">Happy Day</param>
<param name="Состав">95% коттон, 5% эластан</param>
<param name="Материал">Трикотаж</param>
<param name="Замеры">Грудь: S(80), M(82),L(84), талия: S (70), M(72),L(74), бедра:S(90,M(92),L(94), длина - 78. Ткань: Высокой эластичности.,Грудь: S(90), M(92),L(94), талия: S (80), M(82),L(84), бедра:S(100),M(102),L(104), длина - 84. Ткань: Высокой эластичности.</param>
</offer>
<offer available="true" group_id="1329" id="6955">
<url>https://issaplus.com/plate-422-422_korallovyy</url>
<price>210</price>
<old_price>300</old_price>
<currencyId>UAH</currencyId>
<picture>https://issaplus.com/wa-data/public/shop/products/29/13/1329/images/538/538.602x0.jpg</picture>
<picture>https://issaplus.com/wa-data/public/shop/products/29/13/1329/images/539/539.602x0.jpg</picture>
<picture>https://issaplus.com/wa-data/public/shop/products/29/13/1329/images/540/540.602x0.jpg</picture>
<name>Платья ISSA PLUS 422 M коралловый</name>
<description><![CDATA[<p>Платье выполнено из легкой ткани. Горловина округлая. Сзади оригинальный вырез. Длина макси.</p>]]></description>
<vendor>ISSA PLUS</vendor>
<vendorCode>422_коралловый</vendorCode>
<categoryId>25</categoryId>
<param name="Стиль">Вечерний</param>
<param name="Вид">Платья</param>
<param name="Размер">M</param>
<param name="Цвет">коралловый</param>
<param name="Коллекция">In City</param>
<param name="Состав">85% полиэстер, 15% эластан</param>
<param name="Материал">Полиэстер</param>
<param name="Замеры">Грудь: S(80), M(82),L(84), талия: S (70), M(72),L(74), бедра:S(90,M(92),L(94), длина - 78. Ткань: Высокой эластичности.,Грудь: S(90), M(92),L(94), талия: S (80), M(82),L(84), бедра:S(100),M(102),L(104), длина - 84. Ткань: Высокой эластичности.</param>
</offer>
</offers>
</shop>
</yml_catalog>
И я пытаюсь получить каждый параметр но в строке par.text происходит ошибка он возвращеет мне None
res = requests.get(url)
res.encoding = 'utf-8'
tree = html.fromstring(res.text)
for host_ip in tree.xpath("shop/offers/offer"):
for par in host_ip.xpath("param"):
par_text = par.text
par_name = par.attrib['name']
print(par_text)
print(par_name)
print(etree.tostring(par))
Почему так происходит? Параметра encoding у него нет А когда я превращаю его в строку то он возвращает мне
b'<param name="Стиль"/>Вечерний\n'
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Вместо lxml.html использовал lxml.etree и получилось вернуть текст
Причина в том, что тег <param> является зарегистрированным в html и не может иметь текста. Поэтому, парсить нужно именно xml парсером, а не html
Пример:
from lxml import etree
text = ...
tree = etree.fromstring(text)
for host_ip in tree.xpath("shop/offers/offer"):
for par in host_ip.xpath("param"):
print(par.attrib['name'], '->', par.text)
Стиль -> Вечерний
Вид -> Платья
Размер -> XS
Цвет -> принт
Коллекция -> Happy Day
Состав -> 95% коттон, 5% эластан
Материал -> Трикотаж
Замеры -> Грудь: S(80), M(82),L(84), талия: S (70), M(72),L(74), бедра:S(90,M(92),L(94), длина - 78. Ткань: Высокой эластичности.,Грудь: S(90), M(92),L(94), талия: S (80), M(82),L(84), бедра:S(100),M(102),L(104), длина - 84. Ткань: Высокой эластичности.
Стиль -> Вечерний
Вид -> Платья
Размер -> M
Цвет -> коралловый
Коллекция -> In City
Состав -> 85% полиэстер, 15% эластан
Материал -> Полиэстер
Замеры -> Грудь: S(80), M(82),L(84), талия: S (70), M(72),L(74), бедра:S(90,M(92),L(94), длина - 78. Ткань: Высокой эластичности.,Грудь: S(90), M(92),L(94), талия: S (80), M(82),L(84), бедра:S(100),M(102),L(104), длина - 84. Ткань: Высокой эластичности.