在python中使用lxml和request来获取具有特定类名的某些标记之间的文本

时间:2016-05-11 06:48:33

标签: python html python-3.x xpath

我试图抓取具有特定类名的标记之间的所有文本。我相信我非常接近正确,所以我认为它只是一个简单的修复。

在网站上,这些是我试图从中检索数据的标签。我想要' SNP'。

<span class="rtq_exch"><span class="rtq_dash">-</span>SNP  </span>

从我目前的情况来看:

from lxml import html
import requests

def main():

    url_link = "http://finance.yahoo.com/q?s=^GSPC&d=t"
    page = html.fromstring(requests.get(url_link).text)
    for span_tag in page.xpath("//span"):
        class_name = span_tag.get("class")
        if class_name is not None:
            if "rtq_exch" == class_name:
                print(url_link, span_tag.text)

if __name__ == "__main__":main()

我明白了:

http://finance.yahoo.com/q?s=^GSPC&d=t None

要显示它有效,当我更改此行时:

if "rtq_dash" == class_name:

我明白了(请注意&#39; - &#39;标签之间的内容相同):

http://finance.yahoo.com/q?s=^GSPC&d=t -

我认为正在发生的是它会看到子标记并停止抓取数据,但我不确定原因。

我很高兴收到

<span class="rtq_dash">-</span>SNP  

作为span_tag.text的字符串,因为我可以很容易地删除我不想要的内容。

更高的描述,我试图从页面获取股票代码。

Here是请求的文档,here是lxml(xpath)的文档。

我想使用xpath而不是BeautifulSoup有几个原因,所以请不要建议更改使用该库,而不是它更容易。

2 个答案:

答案 0 :(得分:3)

有一些可能的方法。您可以找到外部span并返回它的直接子文本节点:

>>> url_link = "http://finance.yahoo.com/q?s=^GSPC&d=t"
>>> page = html.fromstring(requests.get(url_link).text)
>>> for span_text in page.xpath("//span[@class='rtq_exch']/text()"):
...     print(span_text)
... 
SNP

或找到内部span并获取tail

>>> for span_tag in page.xpath("//span[@class='rtq_dash']"):
...     print(span_tag.tail)
... 
SNP  

答案 1 :(得分:1)

使用BeautifulSoup

import bs4

html = """<span class="rtq_exch"><span class="rtq_dash">-</span>SNP  </span>"""
soup = bs4.BeautifulSoup(html)
snp = list(soup.findAll("span", class_="rtq_exch")[0].strings)[1]