Python, извлечь URL-адреса из XML-карты сайта, которые содержат определенное слово - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь извлечь все 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>

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Я изменяю xml в правильный формат (добавьте <urls> и </urls>), сохраняю их в src.xml:

<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:

>>> 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
0 голосов
/ 30 сентября 2018

Если у вас есть все URL-адреса, вы можете проверить для каждого URL-адреса, есть ли в нем слово «foo», с помощью in.Примерно так (при условии, что у вас уже есть все URL-адреса в списке с именем urls):

urls = [url for url in urls if 'foo' in url]
0 голосов
/ 30 сентября 2018

Предполагая, что они всегда в элементах loc помечены, вы можете использовать метод XPath

//loc[contains(text(),'foo')]

Универсальный будет:

//*[contains(text(),'foo')]

Требуется использование lxml, которое поддерживаетXPath, см. здесь.

...