【问题标题】:How to extract text from a webpage using python 2.7?如何使用 python 2.7 从网页中提取文本?
【发布时间】:2016-12-06 10:50:35
【问题描述】:

我正在尝试以编程方式从该网页中提取描述公共档案中基因组组装的文本:

http://www.ebi.ac.uk/ena/data/view/ERS019623

我有数以千计的程序集要追踪并提取研究加入,即表格最左侧以“PRJ”开头的代码。这些程序集中的每一个的 URL 的格式都与上述相同,即“http://www.ebi.ac.uk/ena/data/view/ERS******”。我的每个程序集都有 ERS ​​代码,因此我可以为每个程序集构建 URL。

我尝试了几种不同的方法,首先,如果您将“&display=XML”添加到 URL 的末尾,它会打印 XML(或者至少我假设它正在打印整个页面的 XML,因为问题是这里找不到学习资料“PRJ******”)。我已经利用它从同一个网页中提取了我需要的另一个代码,运行访问的格式始终为“ERR******”,使用以下代码:

import urllib2
from bs4 import BeautifulSoup
import re
import csv

with open('/Users/bj5/Desktop/web_scrape_test.csv','rb') as f:
reader = csv.reader(f) #opens csv containig list of ERS numbers
for row in reader:
    sample = row[0] #reads index 0 (1st row)
    ERSpage = "http://www.ebi.ac.uk/ena/data/view/" + sample + "&display=xml" #creates URL using ERS number from 1st row
    page = urllib2.urlopen(ERSpage) #opens url and assigns it to variable page
    soup = BeautifulSoup(page, "html.parser") #parses the html/xml from page and assigns it to variable called soup
    page_text = soup.text #returns text from variable soup, i.e. no tags
    ERS = re.search('ERS......', page_text, flags=0).group(0) #returns first ERS followed by six wildcards
    ERR = re.search('ERR......', page_text, flags=0).group(0) #retursn first ERR followed by six wildcards
    print ERS + ',' + ERR + ',' + "http://www.ebi.ac.uk/ena/data/view/" + sample #prints ERS,ERR,URL

这工作得很好,但由于研究加入不在 XML 中,我不能用它来访问它。

我还尝试通过这样做再次使用 BeautifulSoup 下载 HTML:

from bs4 import BeautifulSoup
from urllib2 import urlopen

BASE_URL = "http://www.ebi.ac.uk/ena/data/view/ERS019623"

def get_category_links(section_url):
    html = urlopen(section_url).read()
    soup = BeautifulSoup(html, "lxml")
    print soup

get_category_links(BASE_URL)

但是我在这个输出中也看不到研究加入...

我还尝试使用不同的 python 模块 lxml 来解析 XML 和 HTML,但也没有任何运气。

当我右键单击并检查页面上的元素时,我可以通过 ctrl+F -> PRJ 找到研究加入。

所以我的问题是:我在检查元素、XML 或 HTML(或其他)中查看的代码是什么?为什么当我尝试使用 BeautifulSoup 解析 HTML 时,它与控制台中打印的代码看起来不同?最后,我怎样才能从这些网页中抓取学习资料 (PRJ******)?

(我只编写了几个月的代码,而且我完全是自学成才,所以对于这个问题的稍微混乱的性质表示歉意,但我希望我已经了解了我想要解决的问题做。任何建议或意见将不胜感激。)

【问题讨论】:

  • 大多数情况下,当您在浏览器中获得与以编程方式执行 HTTP 请求不同的内容时,这是因为您要查找的内容是由一些 javascript 代码动态生成的 - 您的浏览器执行但不是你自己的代码。您可以尝试使用 selenium 之类的东西来获取完整内容。

标签: python html xml web-scraping beautifulsoup


【解决方案1】:
from bs4 import BeautifulSoup
import requests
import re

r = requests.get('http://www.ebi.ac.uk/ena/data/view/ERS019623&display=xml')
soup = BeautifulSoup(r.text, 'lxml')

ERS = soup.find('primary_id').text
ERR = soup.find('id', text=re.compile(r'^ERR')).text
url = 'http://www.ebi.ac.uk/ena/data/view/{}'.format(ERS)

print(ERS, ERR, url)

出来:

ERS019623 ERR048142 http://www.ebi.ac.uk/ena/data/view/ERS019623

bs4可以解析xml文件,就像html一样处理,它们都是一样的,所以不需要使用regex来提取信息。

我找到了一个 TEXT 下载链接:

http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession=ERS019623&result=read_run&fields=study_accession,sample_accession,secondary_sample_accession,experiment_accession,run_accession,tax_id,scientific_name,instrument_model,library_layout,fastq_ftp,fastq_galaxy,submitted_ftp,submitted_galaxy,sra_ftp,sra_galaxy,cram_index_ftp,cram_index_galaxy&download=txt

可以更改此链接的文件以获取您想要的数据,如下所示:

http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession=ERS019623&result=read_run&fields=study_accession&download=txt

通过这样做,您可以在文本文件中获取所有数据

【讨论】:

  • 谢谢,太棒了,我完全错过了那个链接
【解决方案2】:

在您的示例中,soup 是一个BeautifulSoup 对象:已解析文档的表示。

如果您想打印文档的整个 HTML,您可以调用 print(soup.prettify()) 或者如果您想要其中的文本 print(soup.get_text())

soup 对象还有其他可能访问您感兴趣的文档部分:到 navigate 解析树,到 search 在其中 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2018-08-04
    • 1970-01-01
    相关资源
    最近更新 更多