我正在努力搜索一个可能写得不好的网站,所以当你最初在他们的页面上执行GET请求时,它会以html,javascript,jquery的混合方式响应5个条目,因为它是视觉效果页面的一部分,如果你想获得更多的条目,你点击一个按钮,它在内部同一页面上执行POST请求以及"分页值"这就像你想要的页面,如果你想要6到10的条目,你给出的值为" 2"分页值,如果你想要条目11到15,你给出一个" 3"的值,它以异步方式执行此操作,并将数据附加到前一个结果集的末尾。
发送/接收不是问题,事实上,当我尝试使用lxml抓取页面时,我可以轻松获取前5个条目的值,但是,当我必须获取第二组数据时,我提供分页值" 2"我希望回复xml数据,因为xml / html很容易解析,但这是我的问题:
他们返回jquery和html的奇怪组合。它是这样的:
$(".entry:last").after("
<div class="entry">
<p>some data</p>
</div>
<!-- 4 more entries omitted -->
");
当你检查他们的网站时,这完美无缺,最后5个条目是通过AJAX异步下载的,顺序添加到前5个条目中,我查看&#34;&#34;&#34;&#34; Jquery的方法,我可以确认它只是在第5个元素之后附加了5个条目。
当我最初抓取他们的数据时,根元素是一个html标记,所以我可以使用lxml解析它,但是我必须解析这个分页结果时提供的响应是Jquery和Jquery的奇怪组合HTML
此外,我可以向您保证,只有一个&#34;&#34;&#34;方法,其他一切都是html,所以基本上是2行Jquery,第一行和最后一行,所以我假设我只是盲目地删除第一行和最后一行然后再次解析它,但是我得到的响应对象我用来执行POST操作的请求库将它作为一个长行数据返回,所以我不能对它执行任何readLine(),从最后一行分隔第二行的第一行,它&#39对我来说只是一条线。所以我想指点如何解决这样的问题。
谢谢:D
答案 0 :(得分:0)
因此,如果我理解正确,问题是“我如何提取嵌入在javascript代码中的HTML”。
快速而肮脏的解决方案是使用正则表达式来提取HTML。这有点挑剔,因为引用但是它不是太糟糕,你需要一个正则表达式,它可以匹配带有转义引号的字符串,这个将为双引号提供技巧,它将匹配双引号之间的任何东西,而不是双引号,或引用双引号:
"((?:[^"]+|\\")+)"
然后你可以使用它来创建一个正则表达式,它将从它的jquery包装中提取html字符串的内容:
import re
mixed_js_html = r'$(".entry:last").after("<div class=\"entry\"><p>some data</p></div>");')
m = re.search(r'after\("((?:[^"]+|\\")+)"\)', mixed_js_html):
html_code = m.group(1)
html_code = html_code.replace('\\"', '"') # unescape quotes
print(html_code)
# <div class="entry"><p>some data</p></div>