題 從站點地圖(xml)中提取鏈接


可以說我有一個 sitemap.xml 包含此數據的文件:

<url>
<loc>http://domain.com/pag1</loc>
<lastmod>2012-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>http://domain.com/pag2</loc>
<lastmod>2012-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>http://domain.com/pag3</loc>
<lastmod>2012-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>

我想從中提取所有位置(數據之間的數據) <loc> 和 </loc>)。

樣本輸出如下:

http://domain.com/pag1
http://domain.com/pag2
http://domain.com/pag3

這該怎麼做?


4
2017-08-27 11:11


起源


你用的是什麼操作系統? - bobmagoo
Windows 7 Ultimate X64 / Windows 8 Pro X64或Ubuntu 12.04 Linux。 - Akshat Mittal
不錯的設置。在Ubuntu框上使用終端, 我的答案如下 會得到你所需要的。 - bobmagoo
您也可以使用任何文本編輯器,如SublimeText2,它可以使用regexp,您可以使用它獲取所有數據,或者您可以使用python查看下面的答案。 - Ishikawa Yoshi


答案:


你可以在這裡使用python腳本

此腳本將啟動任何鏈接 HTTP

import re

f = open('sitemap.xml','r')
res = f.readlines()
for d in res:
    data = re.findall('>(http:\/\/.+)<',d)
    for i in data:
        print i

在你的情況下,下一個腳本找到包含在標籤中的所有數據

import re

f = open('sitemap.xml','r')
res = f.readlines()
for d in res:
    data = re.findall('<loc>(http:\/\/.+)<\/loc>',d)
    for i in data:
        print i

這裡 如果您不熟悉它,可以使用regexp的好工具。

如果你需要加載遠程文件,你可以使用下一個代碼

import urllib2 as ur
import re

f = ur.urlopen(u'http://server.com/sitemap.xml')
res = f.readlines()
for d in res:
  data = re.findall('<loc>(http:\/\/.+)<\/loc>',d)
  for i in data:
    print i

2
2017-08-27 12:00



如何加載遠程文件,如 http://server.com/sitemap.xml。我對Python並不熟悉 - Akshat Mittal
你的意思是加載python? - Ishikawa Yoshi
是的,就像你用過的那樣 f = open('sitemap.xml','r') 打開文件,如何在http服務器上打開遠程文件? - Akshat Mittal
我更新我的帖子,你需要使用urllib2模塊 - Ishikawa Yoshi
顯示錯誤 AttributeError: 'list' object has no attribute 'findall' - Akshat Mittal


如果您使用的是Linux機箱或其他設備 grep的 工具,你可以運行:

grep -Po'http(s?):// [^ \“()\ <>] *'sitemap.xml


7
2017-08-27 11:40



這有效,但有很多錯誤(不完整的URL)。 - Akshat Mittal
很奇怪,我只是跑了過來 Google的sitemap.xml文件 並沒有看到任何問題。它錯過了哪些? - bobmagoo
這錯過了包含“?”的許多網址。和“+”。 - Akshat Mittal
謝謝。任何人都想保存到文件 grep -Po 'http(s?)://[^ \"()\<>]*' sitemap.xml > links.txt - trante
+1這實際上是一個非常簡單但功能強大的解決方案 - SmallChess


這可以通過單個sed命令來完成,它似乎比grep解決方案更加可靠:

sed '/<loc>/!d; s/[[:space:]]*<loc>\(.*\)<\/loc>/\1/' inputfile > outputfile

(發現於: linuxquestions.org


2
2017-08-27 11:39



您的解決方案完美無缺 - Baptiste Donaux
嘗試將其作為sed'/ <loc> /!d; s / [[:space:]] * <loc>(。*)<\ / loc> / \ 1 /'sitemap.xml> links.txt但輸出相同的xml內容。它使用上面的grep命令,但我試圖找出它為什麼不起作用 - Mike
我認為這是因為你沒有用(和)來逃避()。 - LarS


運用 XSLT,你可以用它來渲染它 XPath

/url/loc

1
2017-11-25 01:01



您是否可以擴展您的答案並顯示XSLT指令和所需的XPath查詢? - slhck
@slhck正是我想說的,答案應該更具說明性。 - Akshat Mittal
我再讀了幾篇關於此的內容並最終完成了這項工作。 Upvoting但不是一個非常好的答案選擇。 - Akshat Mittal


XSLT解決方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:s="http://www.sitemaps.org/schemas/sitemap/0.9">

  <xsl:output method="text" />

  <xsl:template match="s:url">
    <xsl:value-of select="s:loc" />
    <xsl:text>
</xsl:text>
  </xsl:template>

</xsl:stylesheet>

0



多年來我一直在使用正則表達式等但是在這種情況下XSLT非常酷:)對於XSLT中的完整noobs(像我一樣),添加你只需要做的事情就是很好:保存這段代碼作為stylesheet.xsl並在你的xml文檔中添加一行,其中包含樣式表的鏈接<?xml-stylesheet type =“text / xsl”version =“1.0”href =“stylesheet.xsl”?>然後在瀏覽器中打開你的xml(它打開本地文件時不起作用,你必須通過http獲取它 - Łukasz Rysiak