几乎与scrapy allow all subdomains重复!
注意:首先,我是Scrapy&的新手。我没有足够的声誉对this问题发表评论。所以,我决定问一个新的!
问题陈述:
我使用BeautifulSoup来废弃特定网站的电子邮件地址。如果该特定页面上的电子邮件地址可用(即example.com),它可以正常工作,但如果example.com/contact-us上有可用的话,则非常明显!
出于这个原因,我决定使用Scrapy。虽然我正在使用allowed_domains 只获得与域名相关的链接,它也为我提供了所有的异地链接。我在this问题中尝试了@agstudy提出的另一种方法,在规则中使用SgmlLinkExtractor。
然后我收到了这个错误,
Traceback (most recent call last): File "/home/msn/Documents/email_scraper/email_scraper/spiders/emails_spider.py", line 14, in <module> from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor File "/home/msn/Documents/scrapy/lib/python3.5/site-packages/scrapy/contrib/linkextractors/sgml.py", line 7, in <module> from scrapy.linkextractors.sgml import * File "/home/msn/Documents/scrapy/lib/python3.5/site-packages/scrapy/linkextractors/sgml.py", line 7, in <module> from sgmllib import SGMLParser ImportError: No module named 'sgmllib'
基本上,ImportError是关于Python 3.x中sgmlib(简单SGML解析器)的弃用
到目前为止我尝试了什么:
class EmailsSpiderSpider(scrapy.Spider):
name = 'emails'
# allowed_domains = ['example.com']
start_urls = [
'http://example.com/'
]
rules = [
Rule(SgmlLinkExtractor(allow_domains=("example.com"),), callback='parse_url'),
]
def parse_url(self, response):
hxs = HtmlXPathSelector(response)
urls = hxs.select("//a/@href").extract()
print(set(urls)) # sanity check
我也尝试过使用CrawlSpider的LxmlLinkExtractor,但仍然会获得非现场链接。
我该怎么做才能完成这项工作?或者我解决问题的方法是错误的吗?
任何帮助将不胜感激!
另一个注意事项: 每次网站都不同于废弃电子邮件。所以,我不能使用特定的HTML或CSS选择器!
答案 0 :(得分:1)
您在hxs.select('//a/@href')
中使用xpath表达式,这意味着从页面上的所有href
标记中提取a
属性值,这样您就可以获得包括异地在内的所有链接那些。您可以使用的是LinkExtractor
,它将是这样的:
from scrapy.linkextractors import LinkExtractor
def parse_url(self,
urls = [l.url for l in LinkExtractor(allow_domains='example.com').extract_links(response)]
print(set(urls)) # sanity check
这就是LinkExtractor
真正为我做的事情。(我猜)。
顺便说一句,请记住,您可以在Internet(包括Stackoverflow)中找到的大多数Scrapy示例都是指早期版本,它们与Python 3完全兼容。