Câu hỏi Trích xuất Liên kết từ sơ đồ trang web (xml)


Cho phép nói rằng tôi có một sitemap.xml tệp với dữ liệu này:

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

Tôi muốn trích xuất tất cả các vị trí từ nó (dữ liệu giữa <loc> và </loc>).

Đầu ra mẫu giống như sau:

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

làm như thế nào?


4
2017-08-27 11:11


gốc


Bạn đang sử dụng hệ điều hành nào? - bobmagoo
Windows 7 Ultimate X64 / Windows 8 Pro X64 hoặc Ubuntu 12.04 Linux. - Akshat Mittal
Thiết lập đẹp. Sử dụng Terminal trên hộp Ubuntu, câu trả lời của tôi bên dưới sẽ giúp bạn có được những gì bạn cần. - bobmagoo
Bạn cũng có thể sử dụng bất kỳ trình soạn thảo văn bản như SublimeText2 có thể sử dụng regexp, bạn có thể nhận được tất cả dữ liệu với nó, hoặc bạn có thể sử dụng python xem câu trả lời của tôi dưới đây. - Ishikawa Yoshi


Các câu trả lời:


Bạn có thể sử dụng tập lệnh python tại đây

Tập lệnh này nhận bất kỳ liên kết nào được bắt đầu bằng 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

Và trong trường hợp của bạn, tập lệnh tiếp theo sẽ tìm tất cả dữ liệu được bao bọc trong thẻ

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

Đây công cụ tuyệt vời để chơi với regexp nếu bạn không quen thuộc với nó.

nếu bạn cần tải tệp từ xa, bạn có thể sử dụng mã tiếp theo

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



Cách tải một tệp từ xa như http://server.com/sitemap.xml. Tôi không biết Python - Akshat Mittal
bạn có nghĩa là tải với python? - Ishikawa Yoshi
Yup, Như bạn đã sử dụng f = open('sitemap.xml','r') để mở tệp, Cách mở tệp từ xa trên máy chủ http? - Akshat Mittal
tôi cập nhật bài viết của tôi, bạn cần sử dụng mô-đun urllib2 - Ishikawa Yoshi
Hiển thị lỗi AttributeError: 'list' object has no attribute 'findall' - Akshat Mittal


Nếu bạn đang ở trên một hộp Linux hoặc một cái gì đó với grep công cụ, bạn chỉ có thể chạy:

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


7
2017-08-27 11:40



Điều này làm việc nhưng với rất nhiều sai lầm (URL không đầy đủ). - Akshat Mittal
Thật lạ lùng, tôi chỉ chạy cái này qua Tệp sitemap.xml của Google và không thấy bất kỳ vấn đề gì. Những người đã làm nó bỏ lỡ? - bobmagoo
Điều này đã bỏ lỡ nhiều url có chứa "?" và "+". - Akshat Mittal
Cảm ơn bạn. Đối với bất kỳ ai muốn lưu vào tệp grep -Po 'http(s?)://[^ \"()\<>]*' sitemap.xml > links.txt - trante
+1 Đây thực sự là một giải pháp rất đơn giản nhưng mạnh mẽ. - SmallChess


Điều này có thể được thực hiện bởi một lệnh sed đơn, mà có vẻ là rắn hơn so với giải pháp grep:

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

(tìm thấy tại: linuxquestions.org)


2
2017-08-27 11:39



Giải pháp của bạn hoạt động hoàn hảo. - Baptiste Donaux
thử nó như sed '/ <loc> /! d; s / [[: không gian:]] * <loc> (. *) <\ / loc> / \ 1 / 'sitemap.xml> links.txt nhưng nó xuất ra cùng một nội dung xml. nó đã làm việc với lệnh grep ở trên nhưng tôi đang cố gắng tìm ra lý do tại sao nó không hoạt động - Mike
Tôi nghĩ rằng đó là bởi vì bạn đã không thoát khỏi () với (và). - LarS


Sử dụng XSLT, bạn có thể kết xuất bằng XPath

/url/loc

1
2017-11-25 01:01



Bạn có thể mở rộng câu trả lời của mình và hiển thị các hướng dẫn XSLT và các truy vấn XPath cần thiết không? - slhck
@slhck Chính xác những gì tôi muốn nói, Câu trả lời nên giải thích thêm. - Akshat Mittal
Tôi đọc thêm một vài điều về điều này và cuối cùng cũng làm việc này. Upvoting nhưng không phải là một câu trả lời thực sự tốt để được chọn. - Akshat Mittal


Giải pháp 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



Trong nhiều năm, tôi đã sử dụng regex vv cho điều này nhưng XSLT là rất mát mẻ trong trường hợp này :) Đối với noobs hoàn thành trong XSLT (như tôi) nó muốn được tốt đẹp để thêm rằng điều duy nhất bạn phải làm là: lưu mã này như stylesheet.xsl và thêm một hàng vào tài liệu xml của bạn với liên kết đến biểu định kiểu <? xml-stylesheet type = "text / xsl" version = "1.0" href = "stylesheet.xsl"?> Sau đó mở xml của bạn trong trình duyệt (nó sẽ không hoạt động khi mở dưới dạng tệp cục bộ, bạn phải tải nó qua http) - Łukasz Rysiak