几乎复制了允许所有子域!
注:首先,我对Scrapy很陌生&我没有足够的声誉来评论 这 的问题。所以,我决定问一个新的!
问题陈述:
我用BeautifulSoup从特定的网站上删除电子邮件地址。如果电子邮件地址在那个特定的页面上可用(即example.com),它是可以正常工作的,但如果它在Example.com/联系人-us上可用,则非常明显。
因此,我决定使用Scrapy。虽然我使用allowed_domains只获得与域相关的链接,但它也为我提供了所有的场外链接。我尝试了@agstudy在这问题中提出的另一种方法,即在规则中使用SgmlLinkExtractor。
然后我发现了这个错误,
追溯(最近一次调用):文件"/home/msn/Documents/email_scraper/email_scraper/spiders/emails_spider.py",第14行,在scrapy.contrib.linkextractors.sgml导入SgmlLinkExtractor文件第7行中,在“从"/home/msn/Documents/scrapy/lib/python3.5/site-packages/scrapy/linkextractors/sgml.py",导入*文件”第7行中,在“从sgmllib导入”SGMLParser ImportError中:没有名为“sgmllib”的模块
基本上,ImportError是关于Python3.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我也尝试了LxmlLinkExtractor和CrawlSpider,但仍然获得离线链接。
我该怎么做才能完成这件事?还是我解决问题的方法是错误的?
任何帮助都将不胜感激!
另一个注意事项:每次网站都会有不同的废电子邮件。所以,我不能使用特定的HTML或CSS选择器!
发布于 2017-01-29 20:13:33
在hxs.select('//a/@href')中使用xpath表达式,这意味着从页面上的所有a标记中提取href属性值,这样就可以准确地获得所有链接,包括非站点链接。您可以使用的是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中找到的大多数Scrapy示例(包括Stackoverflow)都是指与Python 3不完全兼容的早期版本。
https://stackoverflow.com/questions/41923550
复制相似问题