我试图抓取具有特定类名的标记之间的所有文本。我相信我非常接近正确,所以我认为它只是一个简单的修复。
在网站上,这些是我试图从中检索数据的标签。我想要' 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有几个原因,所以请不要建议更改使用该库,而不是它更容易。
答案 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)
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]