通过 python 抓取 sitemap.xml
Crawling sitemap.xml via python
我正在抓取 sitemap.xml,我的 objective 是查找所有 url 及其增量计数。
下面是xml
的结构
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.htcysnc.com/m/designer-sarees</loc>
<lastmod>2014-09-01</lastmod>
<changefreq>hourly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>http://www.htcysnc.com/m/anarkali-suits</loc>
<lastmod>2014-09-01</lastmod>
<changefreq>hourly</changefreq>
<priority>0.9</priority>
</url>
下面是我的代码
from BeautifulSoup import BeautifulSoup
import requests
import gzip
from StringIO import StringIO
def crawler():
count=0
url="http://www.htcysnc.com/sitemap/sitemap_product.xml.gz"
old_xml=requests.get(url)
new_xml=gzip.GzipFile(fileobj=StringIO(old_xml.content)).read()
#new_xml=old_xml.text
final_xml=BeautifulSoup(new_xml)
item_to_be_found=final_xml.findAll('loc')
for i in item_to_be_found:
count=count+1
print i
print count
crawler()
我的输出是这样的
<loc>http://www.htcysnc.com/elegant-yellow-green-suit-seven-east-p63703</loc>
1
<loc>http://www.htcysnc.com/elegant-orange-pink-printed-suit-seven-east-p63705</loc>
2
需要输出为没有 loc 和 /loc 的链接。已尝试替换命令,但会引发错误。
此处 item_to_be_found
列表中的每个项目都是一个 Tag
类型的对象,因此您可以使用 .text
或 .string
获取 <loc>
标签内的字符串他们。虽然 .text
和 .string
有 differences 在这种情况下两者都将工作相同。
for loc in item_to_be_found:
print item_to_be_found.index(loc) + 1, loc.text
这会给你这样的结果
1 http://www.htcysnc.com/m/designer-sarees
2 http://www.htcysnc.com/m/anarkali-suits
您可以使用一些属性来代替循环,这可能会使您的代码更快一些。
print i.text.strip()
那应该给你必要的信息,没有任何标签。
我正在抓取 sitemap.xml,我的 objective 是查找所有 url 及其增量计数。
下面是xml
的结构<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.htcysnc.com/m/designer-sarees</loc>
<lastmod>2014-09-01</lastmod>
<changefreq>hourly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>http://www.htcysnc.com/m/anarkali-suits</loc>
<lastmod>2014-09-01</lastmod>
<changefreq>hourly</changefreq>
<priority>0.9</priority>
</url>
下面是我的代码
from BeautifulSoup import BeautifulSoup
import requests
import gzip
from StringIO import StringIO
def crawler():
count=0
url="http://www.htcysnc.com/sitemap/sitemap_product.xml.gz"
old_xml=requests.get(url)
new_xml=gzip.GzipFile(fileobj=StringIO(old_xml.content)).read()
#new_xml=old_xml.text
final_xml=BeautifulSoup(new_xml)
item_to_be_found=final_xml.findAll('loc')
for i in item_to_be_found:
count=count+1
print i
print count
crawler()
我的输出是这样的
<loc>http://www.htcysnc.com/elegant-yellow-green-suit-seven-east-p63703</loc>
1
<loc>http://www.htcysnc.com/elegant-orange-pink-printed-suit-seven-east-p63705</loc>
2
需要输出为没有 loc 和 /loc 的链接。已尝试替换命令,但会引发错误。
此处 item_to_be_found
列表中的每个项目都是一个 Tag
类型的对象,因此您可以使用 .text
或 .string
获取 <loc>
标签内的字符串他们。虽然 .text
和 .string
有 differences 在这种情况下两者都将工作相同。
for loc in item_to_be_found:
print item_to_be_found.index(loc) + 1, loc.text
这会给你这样的结果
1 http://www.htcysnc.com/m/designer-sarees
2 http://www.htcysnc.com/m/anarkali-suits
您可以使用一些属性来代替循环,这可能会使您的代码更快一些。
print i.text.strip()
那应该给你必要的信息,没有任何标签。