严重错误,拉起选择器

时间:2018-08-03 01:58:14

标签: python html xml scrapy python-requests

我使用的是335个URL列表,每个URL均来自不同的基因访问号,以向NCBI网站GenBank发出请求。我想要的数据部分在一个名为XPath的XPath中:

//*[@id="viewercontent1"]/pre

我似乎无法拿起所需的选择器工具,我需要从GenBank的每个XML页面中摘录一些文本。

我的代码是:

import csv

result = []
for line in open("C:/Projects/NCBI Scraper project/geneAccNumbers.txt"):
    result.append(line.split(','))


csv = open("C:/Projects/NCBI Scraper project/geneAccNumbers.txt", 'r')
for gene in csv.readline().split(','):
URL = URL = 'https://www.ncbi.nlm.nih.gov/nuccore/' + gene + '.1?report=fasta'

def build_url(gene):
return 'https://www.ncbi.nlm.nih.gov/nuccore/' + gene + '.1?report=fasta'

genes_urls = [build_url(gene) for gene in csv]

import pip
import requests

res = []
for url in genes_urls:
res.append(requests.get(url))


import scrapy

hxs.select('//*[@id="viewercontent1"]/pre').extract()

除了最后一行,一切都进行了。我还需要知道拆分和整理我想要的所有已抓取文本数据的方法。

这是我要抓取的信息的网站示例:

https://www.ncbi.nlm.nih.gov/nuccore/DQ147858.1?report=fasta

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您实际上不需要scrapy。您只需要其中一部分,称为parsel即可用于解析响应(您可以使用beautifulsoup或任何您喜欢的HTML解析库)。

但是还有另外一件事:所需的数据是通过JavaScript代码添加的,这意味着在您请求的URL的响应中不存在这些数据。因此,您需要向其API(link)发出额外请求,以获取所需的数据。如您所见,此链接将完全返回您所需的内容。

但是,如果仔细查看URL参数,您会注意到id,我们没有。但是可以很容易地从第一个响应中进行解析。

所以代码将如下所示:

import parsel
import requests

# URL of the data you want
detail_url_template = (
    'https://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi'
    '?id={id}'
    '&db=nuccore'
    '&report=fasta'
    '&extrafeat=null'
    '&conwithfeat=on'
    '&retmode=html'
    '&withmarkup=on'
    '&tool=portal'
    '&log$=seqview'
    '&maxdownloadsize=1000000'
)

data = []
for url in genes_urls:
    # Get the response from the gene URL
    response = requests.get(url)
    s = parsel.Selector(response.text)

    # Extract id value for future request
    val = s.css('#viewercontent1::attr(val)').extract_first()  

    # Get the URL where the data you want is located
    detail_url = detail_url_template.format(id=val)

    response = requests.get(detail_url)
    data.append(response.text)