Scrapy 根据 css 属性从网页中解析 html 字符串
Scrapy parse html strings from webpage based on css attribute
我正在尝试根据 CSS 属性在网页上提取特定的 URL。我可以拉第一个,但我很难添加完整的 URL,或者添加超过 1 个 URL.
我已经尝试 运行 使用 joinurl 或解析来解决许多问题。我不断收到 joinurl.
的全局错误
有更简单的方法吗??
我正在使用 Centos 6.5 & Python 2.7.5
下面的代码将提供第一个 URL,但不会提供 http://www...inline
import scrapy
class PdgaSpider(scrapy.Spider):
name = "pdgavideos" # Name of the Spider, required value
start_urls = ["http://www.pdga.com/videos/"]
# Entry point for the spiders
def parse(self, response):
SET_SELECTOR = 'tbody'
for brickset in response.css(SET_SELECTOR):
HTML_SELECTOR = 'td.views-field.views-field-title a ::attr(href)'
yield {
'http://www.pdga.com': brickset.css(HTML_SELECTOR).extract()[0]
}
当前输出
http://www.pdga.com
/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman
预期输出
url 的完整列表,没有任何中断
我没有足够的声望点数来post举几个例子
你的代码 return 字典,这就是它被破坏的原因:
{'http://www.pdga.com': u'/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman'}
你可以做的是像这样使 yield 这本字典:
yield {
'href_link':'http://www.pdga.com'+brickset.css(HTML_SELECTOR).extract()[0]
}
这会给你一个新的字典,其值为 no break href。
{'href_link': u'http://www.pdga.com/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman'}
注意:Spider必须returnRequest、BaseItem、dict或None,参考parse function.
为了从相对链接中获取绝对 url,您可以使用 Scrapy urljoin() 方法并像这样重写您的代码:
import scrapy
class PdgaSpider(scrapy.Spider):
name = "pdgavideos"
start_urls = ["http://www.pdga.com/videos/"]
def parse(self, response):
for link in response.xpath('//td[2]/a/@href').extract():
yield scrapy.Request(response.urljoin(link), callback=self.parse_page)
# If page contains link to next page extract link and parse
next_page = response.xpath('//a[contains(., "next")]/@href').extract_first()
if next_page:
yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
def parse_page(self, response):
link = response.xpath('//iframe/@src').extract_first()
yield{
'you_tube_link': 'http:' + link.split('?')[0]
}
# To save links in csv format print in console: scrapy crawl pdgavideos -o links.csv
# http://www.youtube.com/embed/tYBF-BaqVJ8
# http://www.youtube.com/embed/_H0hBBc1Azg
# http://www.youtube.com/embed/HRbKFRCqCos
# http://www.youtube.com/embed/yz3D1sXQkKk
# http://www.youtube.com/embed/W7kuKe2aQ_c
我正在尝试根据 CSS 属性在网页上提取特定的 URL。我可以拉第一个,但我很难添加完整的 URL,或者添加超过 1 个 URL.
我已经尝试 运行 使用 joinurl 或解析来解决许多问题。我不断收到 joinurl.
的全局错误有更简单的方法吗??
我正在使用 Centos 6.5 & Python 2.7.5
下面的代码将提供第一个 URL,但不会提供 http://www...inline
import scrapy
class PdgaSpider(scrapy.Spider):
name = "pdgavideos" # Name of the Spider, required value
start_urls = ["http://www.pdga.com/videos/"]
# Entry point for the spiders
def parse(self, response):
SET_SELECTOR = 'tbody'
for brickset in response.css(SET_SELECTOR):
HTML_SELECTOR = 'td.views-field.views-field-title a ::attr(href)'
yield {
'http://www.pdga.com': brickset.css(HTML_SELECTOR).extract()[0]
}
当前输出
http://www.pdga.com
/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman
预期输出
url 的完整列表,没有任何中断
我没有足够的声望点数来post举几个例子
你的代码 return 字典,这就是它被破坏的原因:
{'http://www.pdga.com': u'/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman'}
你可以做的是像这样使 yield 这本字典:
yield {
'href_link':'http://www.pdga.com'+brickset.css(HTML_SELECTOR).extract()[0]
}
这会给你一个新的字典,其值为 no break href。
{'href_link': u'http://www.pdga.com/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman'}
注意:Spider必须returnRequest、BaseItem、dict或None,参考parse function.
为了从相对链接中获取绝对 url,您可以使用 Scrapy urljoin() 方法并像这样重写您的代码:
import scrapy
class PdgaSpider(scrapy.Spider):
name = "pdgavideos"
start_urls = ["http://www.pdga.com/videos/"]
def parse(self, response):
for link in response.xpath('//td[2]/a/@href').extract():
yield scrapy.Request(response.urljoin(link), callback=self.parse_page)
# If page contains link to next page extract link and parse
next_page = response.xpath('//a[contains(., "next")]/@href').extract_first()
if next_page:
yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
def parse_page(self, response):
link = response.xpath('//iframe/@src').extract_first()
yield{
'you_tube_link': 'http:' + link.split('?')[0]
}
# To save links in csv format print in console: scrapy crawl pdgavideos -o links.csv
# http://www.youtube.com/embed/tYBF-BaqVJ8
# http://www.youtube.com/embed/_H0hBBc1Azg
# http://www.youtube.com/embed/HRbKFRCqCos
# http://www.youtube.com/embed/yz3D1sXQkKk
# http://www.youtube.com/embed/W7kuKe2aQ_c