Python 抓取<;标题>;用lxml'标记;伊特帕斯酒店

Python 抓取<;标题>;用lxml'标记;伊特帕斯酒店,python,dom,web-scraping,lxml,iterparse,Python,Dom,Web Scraping,Lxml,Iterparse,我在HTML上使用lxml的iterparse时遇到了问题。我正在尝试获取的文本,但是这个简单的函数在完整的网页上不起作用: def get_title(str): titleIter = etree.iterparse(StringIO(str), tag="title") try: for event, element in titleIter: return element.text # print "Script g

我在HTML上使用lxml的
iterparse
时遇到了问题。我正在尝试获取
的文本,但是这个简单的函数在完整的网页上不起作用:

def get_title(str):
    titleIter = etree.iterparse(StringIO(str), tag="title")
    try:
        for event, element in titleIter:
            return element.text
        # print "Script goes here when it doesn't work"
    except etree.XMLSyntaxError:
        return None
该函数在简单的输入(如“
test
”)上运行良好,但当我给它一个完整的页面时,它无法提取标题

更新:以下是我正在使用的HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" lang="it" xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="icon" href="http://www.tricommerce.it/tricommerce.ico" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Tricommerce - Informazioni sulla privacy</title>
<meta name="description" content="Info sulla privacy" />
<meta name="keywords" content="Accessori notebook Alimentatori Case Cavi e replicatori Controllo ventole Lettori e masterizzatori Modding Pannelli &amp; display Dissipatori Tastiere e mouse Ventole Griglie e filtri Hardware Accessori vari Box esterni Casse e cuffie Sistemi a liquido Paste termiche vendita modding thermaltake vantec vantecusa sunmbeam sunbeamtech overclock thermalright xmod aerocool arctic cooling arctic silver zalman colorsit colors-it sharkoon mitron acmecom Info sulla privacy" />
<meta name="robots" content="index, follow" />
<link rel="stylesheet" href="http://www.tricommerce.it/css/tricommerce.css" />
<link rel="stylesheet" href="css/static.css" />
<script type="text/javascript" src="http://www.tricommerce.it/javascript/vertical_scroll.js"></script>

<script type="text/javascript">
//<![CDATA[
function MM_preloadImages() { //v3.0
 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
   var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
   if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
//]]>
</script>

<link rel="stylesheet" type="text/css" href="http://www.tricommerce.it/css/chromestyle.css" />

<script type="text/javascript" src="http://www.tricommerce.it/javascript/chrome.js">
/***********************************************
* AnyLink CSS Menu script- ? Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
***********************************************/
</script>

</head>
</html>

Tricommerce-Informazioni sulla隐私
//
/***********************************************
*任意链接CSS菜单脚本-?动态驱动器DHTML代码库(www.dynamicdrive.com)
*此通知必须保持完整,以便合法使用
*访问动态驱动http://www.dynamicdrive.com/ 获取完整的源代码
***********************************************/

另外,请简要说明我为什么要使用iterparse,因为我不想在文档的早期加载整个DOM来获得一个标记。

您可能希望发布至少一部分实际要发布的数据 正在尝试解析。如果没有这些信息,这里有一个猜测。如果 元素定义了一个默认的XML名称空间,您需要使用 在寻找元素的时候。例如,看看这个简单的 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"
  xml:lang="en">
  <head>            
    <title>Document Title</title>
  </head>
  <body>
  </body>
</html>
这会失败,因为我们正在查找一个不带 指定名称空间…如果没有名称空间,则解析器不会 要查找匹配项(因为
foo:title
bar:title
,假设
foo:
bar:
是XML定义的 名称空间)

您可以显式使用带有ElementTree接口的命名空间,如 这:


如果这不能解决您的问题,请发布一些示例输入,我们将从那里开始工作。

但是,有没有一种方法可以使用iterparse实现这一点?不尝试通过解析加载整个文档。PS添加了样本HTMLUh…当然。只需使用名称空间前缀指定title标记。我用一个例子更新了答案。明白了。如果我在很多页面中爬行,我是否每次都需要指定正确的名称空间前缀,或者它是否通常适用于
tag={http://www.w3.org/1999/xhtml}标题“
>>> doc = etree.parse(open('foo.html'))
>>> doc.xpath('//title')
[]
>>> doc.xpath('//html:title',
...   namespaces={'html': 'http://www.w3.org/1999/xhtml'})
[<Element {http://www.w3.org/1999/xhtml}title at 0x1087910>]
>>> titleIter = etree.iterparse(StringIO(str), 
...   tag='{http://www.w3.org/1999/xhtml}title')
>>> list(titleIter)
[(u'end', <Element {http://www.w3.org/1999/xhtml}title at 0x7fddb7c4b8c0>)]