【问题标题】:Reading a particular line from a webpage in python从python中的网页读取特定行
【发布时间】:2015-07-06 14:17:55
【问题描述】:

在我的代码中,我试图将网页中的第一行文本放入 python 中的变量中。目前我正在使用 urlopen 来获取我想要阅读的每个链接的整个页面。我如何只阅读网页上的第一行文字。

我的代码:

import urllib2
line_number = 10
id = (np.arange(1,5))
for n in id:
    link =  urllib2.urlopen("http://www.cv.edu/id={}".format(n))
    l = link.read()

我想从网页的以下html代码中提取“旧车”一词:

<html>
    <head>
        <link rel="stylesheet">
        <style>
            .norm { font-family: arial; font-size: 8.5pt; color: #000000; text-decoration : none; }
            .norm:Visited { font-family: arial; font-size: 8.5pt; color: #000000; text-decoration : none; }
            .norm:Hover { font-family: arial; font-size: 8.5pt; color : #000000; text-decoration : underline; }
        </style>
    </head>
    <body>
<b>Old car</b><br>
<sup>13</sup>CO <font color="red">v = 0</font><br>
ID: 02910<br>
<p>
<p><b>CDS</b></p>

【问题讨论】:

  • 第一行会一直在&lt;b&gt;标签内吗?
  • 就像 Anand 暗示的那样,如果第一行总是在 &lt;b&gt; 标记中,那么您可以使用 Python 的正则表达式库中的 buildt,re 来获取 &lt;b&gt; 之间的任何内容标签
  • 不清楚你需要什么。你想从这个网页中提取“旧车”这个词,还是想知道如何提取任何网页上的第一行词?
  • 是的,它将始终位于 标记中,但稍后在网页中的 标记内可能会有其他我不想要的内容。在这个例子中,我需要提取的词是 old car 但在其他网页上,确切的词会有所不同,但每次都在 html 代码中的相同位置。
  • “相同位置”是什么意思?因为您总是可以扩展您的正则表达式以获取 &lt;body&gt;\n&lt;b&gt; 之后的任何内容。如果您基于 &lt;b&gt; 标记之间的所有内容进行正则表达式,您也可以只选择它返回的列表中的第一个元素。您还可以使用string.find,它将返回&lt;b&gt; 和&lt;/b&gt; 标记所在位置的first 索引,然后仅列出它们两个结果之间的字符串。

标签: python html webpage


【解决方案1】:

使用XPath。这正是我们所需要的。

XPath,XML 路径语言,是一种用于从 XML 文档中选择节点的查询语言。

lxml python library 将帮助我们解决这个问题。这是众多之一。 Libxml2、Element Tree 和 PyXML 是其中的一些选项。有很多很多很多库可以做这种事情。

使用 XPath

根据您现有的代码,以下内容将起作用:

import urllib2
from lxml import html
line_number = 10
id = (np.arange(1,5))
for n in id:
    link =  urllib2.urlopen("http://www.cv.edu/id={}".format(n))
    l = link.read()
    tree = html.fromstring(l)
    print tree.xpath("//b/text()")[0]

XPath 查询//b/text() 基本上说“从页面上的&lt;b&gt; 元素中获取文本。tree.xpath 函数调用返回一个列表,我们使用[0] 选择第一个列表。很简单。

关于请求的旁白

Requests library 是使用代码阅读网页的最先进技术。以后可能会省去一些麻烦。

完整的程序可能如下所示:

from lxml import html
import requests

for nn in range(1, 6):
    page = requests.get("http://www.cv.edu/id=%d" % nn)
    tree = html.fromstring(page.text)
    print tree.xpath("//b/text()")[0]

注意事项

这些网址对我不起作用,因此您可能需要稍微修改一下。不过,这个概念是合理的。

除了从网页阅读,您可以使用以下内容来测试 XPath:

from lxml import html

tree = html.fromstring("""<html>
    <head>
        <link rel="stylesheet">
    </head>
    <body>
<b>Old car</b><br>
<sup>13</sup>CO <font color="red">v = 0</font><br>
ID: 02910<br>
<p>
<p><b>CDS</b></p>""")

print tree.xpath("//b/text()")[0] # "Old cars"

【讨论】:

    【解决方案2】:

    如果您要在许多不同的网页上执行此操作,可能会以不同的方式编写,您可能会发现 BeautifulSoup 很有帮助。

    http://www.crummy.com/software/BeautifulSoup/bs4/doc/

    正如您在快速入门底部看到的那样,您应该可以从页面中提取所有文本,然后选择您感兴趣的任何行。

    请记住,这仅适用于 HTML 文本。部分网页大量使用javascript,requests/BeautifulSoup 将无法读取javascript提供的内容。

    Using Requests and BeautifulSoup - Python returns tag with no text

    另请参阅我过去遇到的一个问题,用户 avi 已对此进行了澄清:Want to pull a journal title from an RCSB Page using python & BeautifulSoup

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多