Я пытаюсь извлечь все URL из карты сайта, содержащей слово foo в URL.Мне удалось извлечь все URL, но я не могу понять, как получить только те, которые я хочу.Поэтому в приведенном ниже примере я хочу вернуть только URL-адреса яблок и груш.
<url> <loc> https://www.example.com/p-1224-apples-foo-09897.php </loc> <lastmod>2018-05-29</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> <url> <loc> https://www.example.com/p-1433-pears-foo-00077.php </loc> <lastmod>2018-05-29</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> <url> <loc> https://www.example.com/p-3411-oranges-ping-66554.php </loc> <lastmod>2018-05-29</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url>
Я изменяю xml в правильный формат (добавьте <urls> и </urls>), сохраняю их в src.xml:
<urls>
</urls>
<urls> <url> <loc> https://www.example.com/p-1224-apples-foo-09897.php </loc> <lastmod>2018-05-29</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> <url> <loc> https://www.example.com/p-1433-pears-foo-00077.php </loc> <lastmod>2018-05-29</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> <url> <loc> https://www.example.com/p-3411-oranges-ping-66554.php </loc> <lastmod>2018-05-29</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> </urls>
Используйте xml.etree.ElementTree для разбора xml:
xml.etree.ElementTree
>>> import xml.etree.ElementTree as ET >>> tree = ET.parse('src.xml') >>> root = tree.getroot() >>> for url in root.findall('url'): ... for loc in url.findall('loc'): ... if loc.text.__contains__('foo'): ... print(loc.text) ... https://www.example.com/p-1224-apples-foo-09897.php https://www.example.com/p-1433-pears-foo-00077.php
Если у вас есть все URL-адреса, вы можете проверить для каждого URL-адреса, есть ли в нем слово «foo», с помощью in.Примерно так (при условии, что у вас уже есть все URL-адреса в списке с именем urls):
in
urls
urls = [url for url in urls if 'foo' in url]
Предполагая, что они всегда в элементах loc помечены, вы можете использовать метод XPath
loc
//loc[contains(text(),'foo')]
Универсальный будет:
//*[contains(text(),'foo')]
Требуется использование lxml, которое поддерживаетXPath, см. здесь.
lxml